Ткинтер Рама и сетка - PullRequest
       1

Ткинтер Рама и сетка

0 голосов
/ 28 января 2020

Я проектирую интерфейс с использованием Tkinter, но опция .grid () работает не так, как ожидалось. Я хочу разделить мой экран на два раздела, ВЛЕВО и Вправо. Все кнопки и надписи слева, а остальные справа.

     # Initialise frames
    self.frame_left = tk.Frame(root, bg = "pink", width = 100, height = 100).grid(row = 0, column = 0, sticky = 'E')
    self.frame_right = tk.Frame(root, bg = "red", width = 100, height = 100).grid(row = 0, column = 1, sticky = 'W')

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


    #labels
    self.Name_Label = tk.Label(self.frame_left, text = "Name", font = 12, fg = 'green').grid(row = 1, column = 1)
    self.Phone_Label = tk.Label(self.frame_left, text = "Phone Number", font = 12, fg= 'green').grid(row = 1, column =2)
    self.University_label = tk.Label(self.frame_left, text = "University", font = 12, fg = 'green').grid(row = 1, column = 3)

    #Search boxex
    self.Name_box = tk.Entry(self.frame_left, width =  12, borderwidth = 2).grid(row = 2, column = 1)
    self.Phone_box = tk.Entry(self.frame_left, width =  12, borderwidth = 2).grid(row = 2, column = 2)
    self.Phone_box = tk.Entry(self.frame_left, width =  12, borderwidth = 2).grid(row = 2, column = 3)

    # Buttons
    self.Search_button = tk.Button(self.frame_left, text='Search', padx = 10, pady = 10, font = 12, fg = 'black').grid(row = 5, column = 1)

    #Screen
    #self.Screen = tk.Listbox(self.frame_right, width = 20, height = 20, font = 1).grid(row = 0, column = 0)

Похоже, что метки и кнопки помещаются в окно root, а не в рамки, которые были определены.

Ценю вашу помощь.

С уважением

Хисров

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Когда вы сохраняете элемент .grid(), вы не сохраняете виджет:

self.frame_left = tk.Frame(root, bg = "pink", width = 100, height = 100).grid(row = 0, column = 0, sticky = 'E')

Сохраняет объект сетки в переменной, а не в Frame.

Это может быть исправлено созданием и сеткой в ​​две строки.

import tkinter as tk

class Test():
    def __init__(self):
        root = tk.Tk()

        #EXAMPLE OF DIFFERENCE
        self.frame_left = tk.Frame(root, bg = "pink", width = 100, height = 100).grid(row = 0, column = 0, sticky = 'E')
        print(self.frame_left, "DIDN'T STORE THE FRAME")
        self.frame_left = tk.Frame(root, bg = "pink", width = 100, height = 100)
        self.frame_left.grid(row = 0, column = 0, sticky = 'E')
        print(self.frame_left, "STORED THE FRAME")
        #EXAMPLE OF DIFFERENCE

         # Initialise frames
        self.frame_left = tk.Frame(root, bg = "pink", width = 100, height = 100)
        self.frame_left.grid(row = 0, column = 0, sticky = 'E')
        self.frame_right = tk.Frame(root, bg = "red", width = 100, height = 100)
        self.frame_right.grid(row = 0, column = 1, sticky = 'W')

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


        #labels
        self.Name_Label = tk.Label(self.frame_left, text = "Name", font = 12, fg = 'green').grid(row = 1, column = 1)
        self.Phone_Label = tk.Label(self.frame_left, text = "Phone Number", font = 12, fg= 'green').grid(row = 1, column =2)
        self.University_label = tk.Label(self.frame_left, text = "University", font = 12, fg = 'green').grid(row = 1, column = 3)

        #Search boxex
        self.Name_box = tk.Entry(self.frame_left, width =  12, borderwidth = 2)
        self.Name_box.grid(row = 2, column = 1)
        self.Phone_box = tk.Entry(self.frame_left, width =  12, borderwidth = 2)
        self.Phone_box.grid(row = 2, column = 2)
        self.Phone_box = tk.Entry(self.frame_left, width =  12, borderwidth = 2)
        self.Phone_box.grid(row = 2, column = 3)

        # Buttons
        self.Search_button = tk.Button(self.frame_left, text='Search', padx = 10, pady = 10, font = 12, fg = 'black').grid(row = 5, column = 1)

        #Screen
        #self.Screen = tk.Listbox(self.frame_right, width = 20, height = 20, font = 1).grid(row = 0, column = 0)

Test()

enter image description here

РЕДАКТИРОВАТЬ: добавлен список с полосой прокрутки

# Screen
scrollbar = tk.Scrollbar(self.frame_right)
scrollbar.grid(row = 0, column = 1, sticky = 'nsw')
self.Screen = tk.Listbox(self.frame_right, width = 20, height = 5, font = 1)
self.Screen.grid(row = 0, column = 0, sticky = 'e')
self.Screen.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=self.Screen.yview)

enter image description here

0 голосов
/ 28 января 2020

Чтобы разделить ваш экран на 2 части, вам нужно использовать опцию columnconfigure:

root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)

Это создает сетку в окне root с 2 столбцами, в которых ваши self.frame_left и self.frame_right можно разместить.

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