Tkinter GUI не в нужном месте

Я пытаюсь создать графический интерфейс Tkinter в виде серого прямоугольника с надписью вверху, а затем под раскрывающимся ящиком и с надписью слева от нее, описывающей его и ниже этого другого раскрывающегося окна с меткой слева. Вместо этого я получаю ярлык в нужном месте, но затем два выпадающих окна и ярлыки находятся друг на друга, даже если они находятся в разных кадрах.

from Tkinter import * import ttk class review_gui(): def __init__(self): self.root = Tk() self.EDM_GUI(1) self.root.mainloop() def EDM_GUI(self, column): self.EDM_frm = Frame(self.root, background = "grey") self.EDM_frm.pack(side = "top") EDM_Label_frm = Frame(self.EDM_frm).pack(side = "top") EDM_DD_frm = Frame(self.EDM_frm).pack(side = "bottom") EDM_DB_frm = Frame(EDM_DD_frm).pack(side = "top") EDM_Port_frm = Frame(EDM_DD_frm).pack(side = "bottom") EDM_lbl = Label(EDM_Label_frm, text="EDM", fg="black").pack() EDM_DD_label = Label(EDM_DB_frm, text="Select EDM:", fg="black") EDM_DD_label.pack(side="left") EDM_Drop_Down = ttk.Combobox(EDM_DB_frm, state="readonly") EDM_Drop_Down["values"] = ("One", "Two", "Three") EDM_Drop_Down.pack(side="right") EDM_P_label = Label(EDM_Port_frm, text="Select Portfolio:", fg="black") EDM_P_label.pack(side="left") Port_Drop_Down = ttk.Combobox(EDM_Port_frm, state="readonly") Port_Drop_Down["values"] = ("One", "Two", "Three") Port_Drop_Down.pack(side="right") rg = review_gui() 

2 Solutions collect form web for “Tkinter GUI не в нужном месте”

Стандартный менеджер геометрии pack может показаться странным и своенравным, но это неправда. Одна вещь, которую вы должны понимать, это последовательность ваших действий!

Итак, главный алгорифм таков:

  1. Создается экземпляр (виджета или контейнера) и связан с его родителем.
  2. Экземпляр упакован.

Другими словами: представьте, что вы строите дом! В вашем примере вы начинаете строить дом прямо в магазине или где угодно, поэтому ваш дом не построен в соответствии с вашими планами.

Попытайтесь представить, что каждый кадр – это пол дома. И виджеты внутри него – мебель! Поэтому сначала вы планируете свои этажи с мебелью, а затем упаковываете их, чтобы пожелать.

Я немного изменил вашу функцию EDM_GUI и похоже, что она работает так, как вам хотелось! Не забывайте избегать объявления и упаковки в одной строке, потому что pack возвращает None .

Пример :

 def EDM_GUI(self, column): self.EDM_frm = Frame(self.root, background="grey") self.EDM_frm.pack() EDM_Label_frm = Frame(self.EDM_frm).pack() EDM_DD_frm = Frame(self.EDM_frm).pack() EDM_DB_frm = Frame(EDM_DD_frm) EDM_Port_frm = Frame(EDM_DD_frm) EDM_lbl = Label(EDM_Label_frm, text="EDM", fg="black").pack() EDM_DD_label = Label(EDM_DB_frm, text="Select EDM:", fg="black") EDM_DD_label.pack(side="left") EDM_Drop_Down = ttk.Combobox(EDM_DB_frm, state="readonly") EDM_Drop_Down["values"] = ("One", "Two", "Three") EDM_Drop_Down.pack(side="right") EDM_DB_frm.pack(side="top") EDM_P_label = Label(EDM_Port_frm, text="Select Portfolio:", fg="black") EDM_P_label.pack(side="left") Port_Drop_Down = ttk.Combobox(EDM_Port_frm, state="readonly") Port_Drop_Down["values"] = ("One", "Two", "Three") Port_Drop_Down.pack(side="right") EDM_Port_frm.pack(side="bottom") 

Результат :

вывод

Дополнение : на ваш вопрос о сохранении и логике менеджера pack : я точно не знаю, как работает менеджер pack под капотом, но вы можете протестировать, если что-то пойдет не так или нет, добавив границы вашим фреймам! Просто объявите свои фреймы следующим образом: FrameVar = Frame(parent, relief='raised', borderwidth=10) . Как видите, обозреваемые виджеты размещаются прямо в root окне!

Поэтому я протестировал 3 варианта (из вашего вопроса, из моего ответа и исправленного):

  1. Полностью outframed один (из вашего вопроса)

totallyoutframed

  1. Частично outframed один (из моего ответа)

partiallyoutframed

  1. Исправить, все элементы в кадрах

correctone

Правильный код :

 def EDM_GUI(self, column): self.EDM_frm = Frame(self.root) EDM_Label_frm = Frame(self.EDM_frm) EDM_lbl = Label(EDM_Label_frm, text="EDM", fg="black").pack() EDM_Label_frm.pack() EDM_DD_frm = Frame(self.EDM_frm) EDM_DB_frm = Frame(EDM_DD_frm) EDM_DD_label = Label(EDM_DB_frm, text="Select EDM:", fg="black") EDM_DD_label.pack(side="left") EDM_Drop_Down = ttk.Combobox(EDM_DB_frm, state="readonly") EDM_Drop_Down["values"] = ("One", "Two", "Three") EDM_Drop_Down.pack(side="right") EDM_DB_frm.pack(side="top") EDM_Port_frm = Frame(EDM_DD_frm) EDM_P_label = Label(EDM_Port_frm, text="Select Portfolio:", fg="black") EDM_P_label.pack(side="left") Port_Drop_Down = ttk.Combobox(EDM_Port_frm, state="readonly") Port_Drop_Down["values"] = ("One", "Two", "Three") Port_Drop_Down.pack(side="right") EDM_Port_frm.pack(side="bottom") EDM_DD_frm.pack() self.EDM_frm.pack() 

PS Используйте импорт подстановочных знаков, только если вы любите глобальное загрязнение пространства имен.

Проблема связана с тем, что вы вызываете pack одновременно с созданием виджета:

 EDM_Label_frm = Frame(self.EDM_frm).pack(side = "top") 

В python, когда вы делаете foo().bar() , результат возвращает любую bar() . Таким образом, в случае Frame(...).pack(...) вы получаете то, что .pack(...) . pack всегда возвращает None , поэтому для EDM_Label_frm установлено значение None .

Поскольку для EDM_Label_frm установлено значение None , все дочерние EDM_Label_frm этого фрейма фактически оказываются EDM_Label_frm элементами корневого фрейма. Когда вы вызываете pack или grid , вы вставляете их в корневое окно.

По этой причине вам нужно отделить создание виджета от макета виджетов. Я предлагаю вам всегда делать это, хотя технически вам нужно только это сделать, когда вам нужно использовать виджет в качестве аргументов для других команд.

Если вы сделаете это одно изменение, пользовательский интерфейс будет намного ближе к тому, что вы ожидаете. Я считаю, что лучше всего группировать макет внутри родителя вместе, чтобы было легче получить общий вид макета. Во многих случаях я думаю, что это делает более читаемый код, когда вы группируете все макеты вместе.

Например:

 EDM_Label_frm = Frame(self.EDM_frm) EDM_DD_frm = Frame(self.EDM_frm) EDM_DB_frm = Frame(EDM_DD_frm) EDM_Port_frm = Frame(EDM_DD_frm) self.EDM_frm.pack(side = "top") EDM_Label_frm.pack(side = "top") EDM_DD_frm.pack(side = "bottom") EDM_DB_frm.pack(side = "top") EDM_Port_frm.pack(side = "bottom") 
  • Подклассификация Tkinter для создания пользовательского виджета
  • Tkinter help viewer
  • Python tkinter с календарем ttk
  • Пример кода Tkinter для нескольких окон, почему кнопки не будут загружаться правильно?
  • для создания кнопки при нажатии на печать номера на этой кнопке в поле ввода в python 3.3
  • Ошибка Windows-Pyinstaller «не удалось выполнить сценарий» Когда приложение было нажато
  • Перемещение по виджетам в Tkinter
  • Как создать событие для входа пользователя?
  • Как использовать индексы в Tkinter Label?
  • Tkinter to android translation
  • Базовый таймер обратного отсчета Tkinter
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.