#python #python-3.x #tkinter
#python #python-3.x #tkinter
Вопрос:
Я программирую простое приложение, помогающее отслеживать боевую информацию для dnd с использованием python и tkinter. Я начал со страницы ввода, и она работала нормально, но когда я начал использовать вкладки, чтобы позволить пользователю получить доступ к странице справки, как ни странно, это отрезало около половины исходного вывода, единственное, что я изменил, это использование ttk и my_frame 1 вместо root. Я попытался изменить .place на .grid, и это в какой-то степени сработало, хотя вместо этого кнопки отображались в странных положениях перед остальными выводами. Затем я попытался добавить пустые строки в тег справки, это сработало, но это кажется довольно неэффективным и трудоемким. Я могу догадаться, что из этого нет места, но геометрия была установлена на 500×500, чего должно быть много. Итак, я пытаюсь выяснить, что происходит не так. Спасибо за чтение! (Кроме того, он еще не совсем завершен, поэтому функция next page выполняет что-то случайное) Это код:
import tkinter as tk
from tkinter import ttk
#Starting up tkinter
root = tk.Tk()
root.title("Dungeons and dragons combat manager")
root.geometry("500x500")
root.configure(background = "White")
#Initialise the arrays
player_details = []
overall_data = []
#help page
my_notebook = ttk.Notebook(root)
my_notebook.pack(pady = 15)
my_frame1 = tk.Frame(my_notebook, width = "500", height = "500")
my_frame1.grid(row = 0, column = 0, columnspan = 2, padx = 40, pady = 5)
my_frame2 = tk.Frame(my_notebook, width = 500, height = 500)
my_notebook.add(my_frame1, text = "Main")
my_notebook.add(my_frame2, text = "Help")
line1 = tk.Label(my_frame2, text = "Hello, welcome to the help page!", font = ('Times New Roman', 12)).grid(row = 0, column = 0, sticky = 'W')
line2 = tk.Label(my_frame2, text = "Most of the instructions will be given during application use", font = ('Times New Roman', 12)).grid(row = 1, column = 0, sticky = 'W')
line3 = tk.Label(my_frame2, text = "Please ensure all numerical inputs are given in integers", font = ('Times New Roman', 12)).grid(row = 2, column = 0, sticky = 'W')
line4 = tk.Label(my_frame2, text = "If any mistakes are made please press the restart button", font = ('Times New Roman', 12)).grid(row = 3, column = 0, sticky = 'W')
line5 = tk.Label(my_frame2, text = "Once the order is displayed initiative cannot be changed", font = ('Times New Roman', 12)).grid(row = 4, column = 0, sticky = 'W')
line6 = tk.Label(my_frame2, text = "However, health can be edited at any time", font = ('Times New Roman', 12)).grid(row = 5, column = 0, sticky = 'W')
line7 = tk.Label(my_frame2, text = "Good luck with your encounter!", font = ('Times New Roman', 12)).grid(row = 6, column = 0, sticky = 'W')
#main section
tk.Label(my_frame1, text = "Player details form", font = ('Times New Roman', 16)).grid(row = 0, column = 0, padx = 25, pady = 5)
#function definitions
def submit():
player_details = []
player_details.append(name.get())
player_details.append(health.get())
player_details.append(ac.get())
player_details.append(initiative.get())
overall_data.append(player_details)
print(str(overall_data))
player_num = tk.Label(root, text = "Inputting for Player :" str(len(overall_data) 1), fg = 'White', bg = "Black")
player_num.place(x = 30, y = 210, width = 240, height = 25)
def clear():
name.delete(0, 'end')
health.delete(0, 'end')
ac.delete(0, 'end')
initiative.delete(0, 'end')
name.focus_set()
def next_page():
print("chicken")
#display
player_data = ['Name: ','Health: ','Armour Class: ','initiative: ']
labels = range(4)
for i in range(4):
bg_colour = "Black"
l = tk.Label(my_frame1,
text = player_data[i],
fg='White',
bg=bg_colour)
l.place(x = 20, y = 60 i*30, width=120, height=25)
name = tk.Entry(my_frame1,width = 15,fg = "Black",bg = "White")
name.place(x = 150, y = 60, width = 120, height=25)
health = tk.Entry(my_frame1, width = 15,fg = "Black",bg = "White")
health.place(x = 150, y = 90, width = 120, height=25)
ac = tk.Entry(my_frame1, width = 15,fg = "Black",bg = "White")
ac.place(x = 150, y = 120, width = 120, height=25)
initiative = tk.Entry(my_frame1, width = 15,fg = "Black",bg = "White")
initiative.place(x = 150, y = 150, width = 120, height=25)
submit_button = tk.Button(my_frame1, text = "Submit", command = submit)
submit_button.place(x = 30, y = 180, width = 100, height = 25)
clear_button = tk.Button(my_frame1, text = "Clear", command = clear)
clear_button.place(x = 160, y = 180, width = 100, height = 25)
player_num = tk.Label(my_frame1, text = "Inputting for Player : 1", fg = 'White', bg = "Black")
player_num.place(x = 30, y = 210, width = 240, height = 25)
next_button = tk.Button(my_frame1, text = "Next", command = next_page)
next_button.place(x = 30, y = 240, width = 100, height = 25)
'''
Комментарии:
1. Ошибка имени: имя ‘next_page’ не определено
Ответ №1:
Это потому, что вы не сделали ноутбук достаточно большим и не попросили его расширить, чтобы заполнить доступное пространство. Вы полагаетесь на размер ноутбука по умолчанию и помещаете в него больше вещей, чем поместится. Кроме того, вы используете place
instead pack
внутри ноутбука, и place
это не приведет к увеличению или уменьшению содержащего окна. Это один из недостатков использования place
в качестве механизма компоновки общего назначения.
Простое решение — использовать pack
поддерживаемые опции, такие как fill
и expand
, хотя, не зная, как должен выглядеть ваш полный пользовательский интерфейс, трудно сказать, правильное это решение или нет.
my_notebook.pack(fill="both", expand=True)
Другим решением было бы прекратить использование place
. Если вы используете grid
и / или pack
, то размер записной книжки будет соответствовать ее содержимому.