Что является лучшим менеджером геометрии Tkinter, чем .grid ()

Моя жалоба

В настоящее время я углубляюсь глубже, чем «когда-либо», в графический интерфейс Tkinter, и я обнаружил, что .grid() геометрии .grid() неадекватен по нескольким причинам:

  • Разница между флажками командной строки «проверка» и «интерактивная» в Python
  • Как читать данные изображений из URL-адреса в Python?
  • Как получить информацию WhoIs по IP в Python 3?
  • Выход субпроцесса захвата
  • как запустить exe-файл с помощью аргументов с помощью python
  • pandas dataframe с заголовком 2 строки и экспорт в csv
    1. Графики основаны на самом большом виджетах внутри них – эта относительность приводит к неточности.

    2. В Windows 7, на Python 2.7.3, программа, похоже, не учитывает мои номера строк, вместо этого предпочитает использовать порядок виджетов.

    Мой код

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

     ========Class __init__ Stuff============ def widget(self):#Place widgets here #Save Button self.saveButton = Button (self, text = "Save", command = self.saveMe) self.saveButton.grid(column = 0, row = 0, sticky = W) #Open Button self.openButton = Button (self, text = "Open", command = self.openMe) self.openButton.grid(column = 0, row = 1, sticky = W) #Area where you write self.text = Text (self, width = (root.winfo_screenwidth() - 20), height = (root.winfo_screenheight() - 10)) self.text.grid(row = 2) ==============Mainloop/Command Stuff============ 

    Мой вопрос

    Есть ли другой способ использовать геометрический менеджер .grid() таким образом, который является более точным, или я должен использовать другую функцию вообще?

    Благодаря!

  • Объединение строк двух данных в пандах
  • Аргумент «Тензорный поток»
  • Преобразование заголовка строки в столбец для Pandas DataFrame,
  • Внедрение сервера
  • входные размеры в одномерную сверточную сеть в керасе
  • Flask hello world использует apache и mod_wsgi показывает файлы только в веб-канале
  • 4 Solutions collect form web for “Что является лучшим менеджером геометрии Tkinter, чем .grid ()”

    Есть 3 менеджера геометрии, которые у вас есть для вас – grid , pack и place . Третий – самый общий, но также очень сложный в использовании. Я предпочитаю grid . Обратите внимание, что вы можете размещать виджеты внутри других виджетов – или вы можете указать columnspan . Итак, если вы хотите получить следующий макет:

      ------------------------- | Button1 | Button2 | ------------------------- | Big Widget | ------------------------- 

    есть 2 канонических способа сделать это, используя .grid . Первый метод – columnspan :

     import Tkinter as Tk root = Tk.Tk() b1 = Tk.Button(root,text="Button1") b1.grid(row=0,column=0) b2 = Tk.Button(root,text="Button2") b2.grid(row=0,column=1) big_widget = Tk.Canvas(root) big_widget.grid(row=1,column=0,columnspan=2) 

    * Обратите внимание, что есть также аналогичная опция rowspan .

    Второй способ – использовать Frame для удерживания кнопок:

     import Tkinter as Tk root = Tk.Tk() f = Tk.Frame(root) f.grid(row=0,column=0) #place buttons on the *frame* b1 = Tk.Button(f,text="Button1") b1.grid(row=0,column=0) b2 = Tk.Button(f,text="Button2") b2.grid(row=0,column=1) big_widget = Tk.Canvas(root) big_widget.grid(row=1,column=0) #don't need columnspan any more. 

    Этот метод SUPER полезен для создания сложных макетов – я не знаю, как вы могли бы создать сложный макет, не используя объекты Frame подобные этому …

    «Лучший» менеджер геометрии зависит от того, что вы хотите сделать, никакой менеджер геометрии лучше всего подходит для всех ситуаций. Для того, что вы пытаетесь сделать в этом конкретном случае, пакет, вероятно, лучший выбор. Также обратите внимание, что в приложении может быть несколько «лучших». Вполне нормально использовать как сетку, так и пакет в разных частях ваших приложений. Я редко когда-либо создаю графический интерфейс, где я не использую как сетку, так и пакет. И редко, я также использую место.

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

    Мой совет состоит в том, чтобы разделить виджеты приложений на группы и использовать правильный менеджер геометрии для каждой группы. В вашем случае у вас есть две логические группы: панель инструментов вверху и комбинация текста и виджета и прокрутки внизу. Итак, начните с двух кадров. Поскольку панель инструментов находится сверху, а текстовый виджет ниже, пакет работает лучше всего.

     toolbar = tk.Frame(...) main = tk.Frame(...) toolbar.pack(side="top", fill="x", expand=False) main.pack(side="bottom", fill="both", expand=True) 

    Вышеизложенное дает вам две области, которые легко изменить независимо.

    Для панели инструментов пакет снова является наиболее естественным. В этом случае, однако, вам нужны кнопки слева, а не сверху или снизу:

     b1 = tk.Button(toolbar, ...) b2 = tk.Button(toolbar, ...) b1.pack(side="left") b2.pack(side="left") ... 

    Наконец, нижняя область. В вашем примере кода не отображаются полосы прокрутки, но я предполагаю, что в какой-то момент вы захотите их добавить. сетка работает хорошо, если вы используете горизонтальные и вертикальные полосы прокрутки. Я бы выложил их так:

     hsb = tk.Scrollbar(main, ..., orient="horizontal", ...) vsb = tk.Scrollbar(main, ..., orient="vertical", ...) text = tk.Text(main, ...) vsb.grid(row=0, column=1, sticky="ns") hsb.grid(row=1, column=0, sticky="ew") text.grid(row=0, column=0, sticky="nsew") main.grid_rowconfigure(0, weight=1) main.grid_columnconfigure(0, weight=1) 

    Эта последняя часть важна – вам всегда нужно придавать вес хотя бы одному ряду и одному столбцу. Это указывает сетке, строки и столбцы которой должны увеличиваться и сжиматься при изменении размера окна.

    Я считаю, что менеджер места самый интуитивный и точный из всех трех, из-за возможности указать комбинации абсолютной и относительной длины для обеих позиций и размера:

     mywidget.place(x=..., y=..., width=..., height=...) # absolute mywidget.place(relx=..., rely=..., relwidth=..., relheight=...) # relative # combination pad_left=5 pad_right=5 pad_top=5 pad_bottom=5 mywidget.place(relx=0, x=pad_left, rely=0, y=pad_top,\ relwidth=1, width=-pad_left-pad_right,\ relheight=1, height=-pad_top-pad_bottom, anchor="e") # use the whole space except some padding 

    По какой-то причине менеджер .place не очень нравится, но я считаю, что особенно важно определить, как ваши виджеты должны перемещаться и изменять размер при изменении размера родительского окна.

    Чтобы облегчить создание сложных окон, я иногда использую функцию (например, для эмуляции поведения сетки), чтобы помочь в вертикальном размещении, например:

     def offset_y(line_no): if line_no == 0: return 0 else: return height_label + (line_no - 1)*height_button mylabel.place(..., y=offset_y(0)) mybtn1.place(..., y=offset_y(1)) etc. 

    для упаковки вертикально метки, а затем серии кнопок. (Конечно, в этом случае можно использовать менеджер .pack , но причина, по которой я предпочитаю менеджер .place – это более точное понимание того, как вещи будут перемещаться при изменении размера окна).

    Вместо строки, столбца … и т. Д. Вы можете использовать координаты.

    Это может быть проще, чем другие.

    ПРИМЕР:

     from Tkinter import* root=Tk() Button(root,text="HI").grid(padx=100,pady=50) root.mainloop() 

    Попробуйте сами, изменив значения padx и pady.

    Python - лучший язык программирования в мире.