Почему моя программа на python отсекает хорошую часть моего вывода tkinter?

#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 , то размер записной книжки будет соответствовать ее содержимому.