Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Tkinter框架和网格_Python 3.x_Tkinter - Fatal编程技术网

Python 3.x Tkinter框架和网格

Python 3.x Tkinter框架和网格,python-3.x,tkinter,Python 3.x,Tkinter,我正在使用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,

我正在使用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)
标签和按钮似乎放置在根窗口上,而不是已定义的框架上

谢谢你的帮助

问候


Khisrow

要将屏幕分为两部分,您需要使用选项
columnconfigure

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

这将在
root
窗口上创建一个网格,其中有两列,可以放置
self.frame\u left
self.frame\u right

存储
.grid()
项时,您没有存储小部件:

self.frame_left = tk.Frame(root, bg = "pink", width = 100, height = 100).grid(row = 0, column = 0, sticky = 'E')
将网格对象存储到变量,而不是

这可以通过在两行中进行创建和栅格来修复

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()

编辑:添加了一个带有滚动条的列表框

# 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)

谢谢,我试着按照解释的那样做,但标签和按钮似乎放在根窗口上,而不是框架上。为了清晰起见,我添加了整个代码。@user3064089在
columnconfigure
中,权重必须是
weight=1
。我看代码没有问题。它应该是选定的网格。此外,所有标签、搜索框和按钮都有
None
as
tk.Entry(…).grid(…)
return None您的主要问题是放置在哪里
grid()
。当需要定义类似于框架的变量时,不能将网格放置在线的末端。由于所有几何体管理器
grid()
pack()
place()
始终返回无,因此通过将
grid()
添加到定义小部件的末尾,变量实际上将是
None
。要解决此问题,可以在一行定义变量/小部件,然后在下一行将几何图形管理器应用于变量。这对于框架和输入字段等容器来说非常重要。对于按钮和标签,只有在您计划以后编辑它们时才重要。非常感谢您的帮助。我按照步骤做了,是的,它确实有帮助,但当我试图在红色框架上添加一个列表框时,整个形状都改变了。我认为每个帧应该彼此独立?它将根缩放到
列表框的大小,因为它们共享同一个根窗口,您可能需要一个带有滚动条的较小的列表框,但这是一个完全不同的问题。