Ткинтер: рамка и сетка - PullRequest
0 голосов
/ 18 мая 2018

Я, по жизни, не могу понять, как использовать grid() для управления виджетами внутри Frame ( Python 3.6 ).Код ниже пытается показать матрицу 2 × 2 ListBox es в корневом окне.

    import tkinter as TK

    root = TK.Tk()
    root.title('My App')
    rootWidth = 768
    rootHeight = 768
    root.geometry('{}x{}+0+0'.format(rootWidth, rootHeight))
    root.resizable(width=False, height=False)

    frame00 = TK.Frame(root, bd=2, relief=TK.SUNKEN)
    box00 = TK.Listbox(frame00, bd=0)
    box10 = TK.Listbox(frame00, bd=0)

    box00.grid(row=0, sticky=TK.N)
    box10.grid(row=1, sticky=TK.S)
    frame00.grid(row=0, column=0, sticky=TK.W)
    frame00.rowconfigure(0, weight=1)
    frame00.rowconfigure(1, weight=1)


    frame01 = TK.Frame(root, bd=2, relief=TK.SUNKEN)
    box01 = TK.Listbox(frame01, bd=0)
    box11 = TK.Listbox(frame01, bd=0)

    box01.grid(row=0, sticky=TK.N)
    box11.grid(row=1, sticky=TK.S)
    frame01.grid(row=0, column=1, sticky=TK.E)
    frame01.rowconfigure(0, weight=1)
    frame01.rowconfigure(1, weight=2)

    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    root.grid_columnconfigure(1, weight=1)

    for i in range(20):
        box00.insert(TK.END, 'test')
        box10.insert(TK.END, 'test')
        box01.insert(TK.END, 'test')
        box11.insert(TK.END, 'test')

В конце я вижу только две ListBoxes (то есть только одну строку)вместо 4 из них в моем графическом интерфейсе.Но, если я использую один Frame на ListBox, то все работает.

    import tkinter as TK

    root = TK.Tk()
    root.title('My App')
    rootWidth = 768
    rootHeight = 768
    root.geometry('{}x{}+0+0'.format(rootWidth, rootHeight))
    root.resizable(width=False, height=False)

    frame00 = TK.Frame(root, bd=2, relief=TK.SUNKEN)
    box00 = TK.Listbox(frame00, bd=0)
    frame10 = TK.Frame(root, bd=2, relief=TK.RAISED)
    box10 = TK.Listbox(frame10, bd=0)

    box00.grid(row=0, sticky=TK.N)
    box10.grid(row=0, sticky=TK.S)
    frame00.grid(row=0, column=0, sticky=TK.W)
    frame10.grid(row=1, column=0, sticky=TK.W)


    frame01 = TK.Frame(root, bd=2, relief=TK.SUNKEN)
    box01 = TK.Listbox(frame01, bd=0)
    frame11 = TK.Frame(root, bd=2, relief=TK.RAISED)
    box11 = TK.Listbox(frame11, bd=0)

    box01.grid(row=0, sticky=TK.N)
    box11.grid(row=0, sticky=TK.S)
    frame01.grid(row=0, column=1, sticky=TK.E)
    frame11.grid(row=1, column=1, sticky=TK.E)

    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    root.grid_columnconfigure(1, weight=1)

    for i in range(20):
        box00.insert(TK.END, 'test')
        box10.insert(TK.END, 'test')
        box01.insert(TK.END, 'test')
        box11.insert(TK.END, 'test')

Это то, что внутри Frame вы можете использовать только pack()?

ОБНОВЛЕНИЕ

Люди в ветке указали, что в исходном списке кодов я не использовал аргумент ключевого слова column в этих вызовах grid().Фактически, я сделал, просто я удалил их в своей последней попытке перед публикацией, которая в основном привела к тому же самому.

Вот новая версия, которая включает в себя column аргументы, которые показывают только два ListBox ес тоже.

root = TK.Tk()
root.title('Script Launcher')
rootWidth = 768
rootHeight = 768
root.geometry('{}x{}+0+0'.format(rootWidth, rootHeight))
root.resizable(width=False, height=False)

frame00 = TK.Frame(root, bd=2, relief=TK.SUNKEN)
box00 = TK.Listbox(frame00, bd=0)
box10 = TK.Listbox(frame00, bd=0)

box00.grid(row=0, column=0, sticky=TK.N)
box10.grid(row=1, column=0, sticky=TK.S)
frame00.grid(row=0, column=0, sticky=TK.W)
frame00.rowconfigure(0, weight=1)
frame00.rowconfigure(1, weight=1)
frame00.columnconfigure(0, weight=1)


frame01 = TK.Frame(root, bd=2, relief=TK.SUNKEN)
box01 = TK.Listbox(frame01, bd=0)
box11 = TK.Listbox(frame01, bd=0)

box01.grid(row=0, column=1,  sticky=TK.N)
box11.grid(row=1, column=1, sticky=TK.S)
frame01.grid(row=0, column=1, sticky=TK.E)
frame01.rowconfigure(0, weight=1)
frame01.rowconfigure(1, weight=1)
frame01.columnconfigure(0, weight=1)

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=1)

for name in range(20)
    box00.insert(TK.END, 'test')
    box10.insert(TK.END, 'test')
    box01.insert(TK.END, 'test')
    box11.insert(TK.END, 'test')


root.mainloop()

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Вы можете использовать grid () внутри Frame.Вот пример.Надеюсь, это поможет ...

    import tkinter as tk
    from tkinter import *
    from tkinter import ttk

    class GUI:

        def __init__(self, master):
            mainframe = ttk.Frame(master)
            mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
            mainframe.columnconfigure(0, weight=1)
            mainframe.rowconfigure(0, weight=1)
            list1 = Listbox(master, bd=0)
            list1.grid(column=0, row=0)
            list2 = Listbox(master, bd=0)
            list2.grid(column=1, row=0)
            separator1 = Frame(list1, height=2, bd=1, relief=SUNKEN)
            separator1.grid(column=0, row=0)
            separator2 = Frame(list1, height=2, bd=1, relief=SUNKEN)
            separator2.grid(column=1, row=0)
            separator3 = Frame(list2, height=2, bd=1, relief=SUNKEN)
            separator3.grid(column=2, row=0)
            separator4 = Frame(list2, height=2, bd=1, relief=SUNKEN)
            separator4.grid(column=3, row=0)
            e1 = Label(separator1, text='Label1')
            e1.grid(sticky=W+E)
            e2= Label(separator2, text='Label2')
            e2.grid(sticky=W+E)
            e3 = Label(separator3, text='Label3')
            e3.grid(sticky=W+E)
            e4= Label(separator4, text='Label4')
            e4.grid(sticky=W+E)    

    root = Tk()
    my_gui = GUI(root)
    root.mainloop()

Вот очень хорошее объяснение для tkinter http://effbot.org/tkinterbook/grid.htm

0 голосов
/ 18 мая 2018

Метод grid () сообщает GridManager, как обрабатывать виджет, вызывающий grid ().Так что если бы вы вызвали Tk (). Grid (), это было бы бессмысленно, да.Я предпочитаю иметь класс, подобный MyApp, в качестве «оболочки» базового уровня для всех внутренних виджетов.

Переписан на моей системе, это создает графический интерфейс в виде:

-----------------------------------
|                |                |
|                |                |
|    ListBox     |     ListBox    |
|                |                |
|                |                |
-----------------------------------
|                |                |
|                |                |
|    ListBox     |     ListBox    |
|                |                |
|                |                |
-----------------------------------

внешний уровень - TK.Tk(), его первый внутренний уровень - TK.Frame().Затем это разбивается на левый и правый, каждый TK.Frame().Выглядит примерно так:

-----------------------------------
|                |                |
|                |                |
|                |                |
|                |                |
|                |                |
|     Frame      |      Frame     |
|                |                |
|                |                |
|                |                |
|                |                |
|                |                |
-----------------------------------

Затем мы сопоставляем каждый внутренний кадр по вертикали, устанавливая веса строк.

import tkinter as TK

class MyApp(TK.Frame):

    def __init__(self, master):
        super().__init__(master) # initialize the 'TK.Frame'

        # configure the root Frame (i.e. 'self')
        self.master = master # just for reference later
        self.master.grid_rowconfigure(0, weight = 1)
        self.master.grid_columnconfigure(0, weight = 1)
        self.grid(column = 0, row = 0, sticky = 'nsew')
        self.grid_rowconfigure(0, weight = 1)
        self.grid_columnconfigure(0, weight = 1) # columns will split space
        self.grid_columnconfigure(1, weight = 1) # columns will split space

        # configure internal left Frame
        self.left_frame = TK.Frame(self, borderwidth = 2, relief = TK.SUNKEN)
        self.left_frame.grid_rowconfigure(0, weight = 1) # rows will split space
        self.left_frame.grid_rowconfigure(1, weight = 1) # rows will split space
        self.left_frame.grid_columnconfigure(0, weight = 1)
        self.left_frame.grid(column = 0, row = 0, sticky = 'nsew')
        self.left_box0 = TK.Listbox(self.left_frame, borderwidth = 0)
        self.left_box0.grid(column = 0, row = 0, sticky = 'nsew')
        self.left_box1 = TK.Listbox(self.left_frame, borderwidth = 0)
        self.left_box1.grid(column = 0, row = 1, sticky = 'nsew')

        # configure internal right Frame
        self.right_frame = TK.Frame(self, borderwidth = 2, relief = TK.SUNKEN)
        self.right_frame.grid_rowconfigure(0, weight = 1) # rows will split space
        self.right_frame.grid_rowconfigure(1, weight = 1) # rows will split space
        self.right_frame.grid_columnconfigure(0, weight = 1)
        self.right_frame.grid(column = 1, row = 0, sticky = 'nsew')
        self.right_box0 = TK.Listbox(self.right_frame, borderwidth = 0)
        self.right_box0.grid(column = 0, row = 0, sticky = 'nsew')
        self.right_box1 = TK.Listbox(self.right_frame, borderwidth = 0)
        self.right_box1.grid(column = 0, row = 1, sticky = 'nsew')

        for i in range(20):
            self.left_box0.insert(TK.END, 'test')
            self.left_box1.insert(TK.END, 'test')
            self.right_box0.insert(TK.END, 'test')
            self.right_box1.insert(TK.END, 'test')


if __name__ == '__main__': # get in the habit of doing this
    root = TK.Tk()
    root.title('My App')
    root.geometry('{}x{}'.format(768, 768))
    root.resizable(width = False, height = False)
    app = MyApp(root)
    app.mainloop()
0 голосов
/ 18 мая 2018

Вы забыли добавить column к grid, см. Этот пример, чтобы сделать это.

box00.grid(row=0, column=45, sticky=TK.N)

grid работает как лист Excel с rows и column

проверьте эту ссылку , чтобы узнать больше об этом.это хорошо задокументировано там.

ПОЛНЫЙ КОД

import tkinter as TK

root = TK.Tk()
root.title('My App')
rootWidth = 768
rootHeight = 768
root.geometry('{}x{}+0+0'.format(rootWidth, rootHeight))
root.resizable(width=False, height=False)

frame00 = TK.Frame(root, bd=2, relief=TK.SUNKEN)
box00 = TK.Listbox(frame00, bd=0)
box10 = TK.Listbox(frame00, bd=0)

box00.grid(row=0, column=75, sticky=TK.N)
box10.grid(row=1, column=5, sticky=TK.S)
frame00.grid(row=0, column=0, sticky=TK.W)
frame00.rowconfigure(0, weight=1)
frame00.rowconfigure(1, weight=1)

frame01 = TK.Frame(root, bd=2, relief=TK.SUNKEN)
box01 = TK.Listbox(frame01, bd=0)
box11 = TK.Listbox(frame01, bd=0)

box01.grid(row=0, column=7, sticky=TK.N)
box11.grid(row=1, column=60,  sticky=TK.S)
frame01.grid(row=0, column=1, sticky=TK.E)
frame01.rowconfigure(0, weight=1)
frame01.rowconfigure(1, weight=2)

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=1)

for i in range(20):
    box00.insert(TK.END, 'test')
    box10.insert(TK.END, 'test')
    box01.insert(TK.END, 'test')
    box11.insert(TK.END, 'test')

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...