首页 > 解决方案 > Python Tkinter 网格未按要求设置

问题描述

tkinter在我的应用程序中使用,并使用以下代码设置了一个框架:

from tkinter import *
from tkinter import ttk
from tkinter import simpledialog

class View:
    def __init__(self,tab):
        self.tab1 = tab

        self.widgets() 

    def proxy_checkbox_clicked(self, event=None):
        if self.proxyVar.get() == 0:
            self.proxyIPTextEdit.config(state=DISABLED)
            self.proxyPortTextEdit.config(state=DISABLED)
            self.proxyUserTextEdit.config(state=DISABLED)
            self.proxyPassTextEdit.config(state=DISABLED)
        else:
            self.proxyIPTextEdit.config(state=NORMAL)
            self.proxyPortTextEdit.config(state=NORMAL)
            self.proxyUserTextEdit.config(state=NORMAL)
            self.proxyPassTextEdit.config(state=NORMAL)

    def widgets(self):
        self.mainFrame = Frame(self.tab1)
        self.mainFrame.grid(column = 0, row = 0, padx = 0, pady = 0)

        # Set Add Frame
        self.loginFrame = Frame(self.mainFrame)
        self.loginFrame.grid(column = 0, row = 0, padx = 0, pady = 0)

        label = Label(self.loginFrame, text = "Name:")
        label.grid(column = 0, row = 0, sticky = 'W')

        self.nameTextEdit = Entry(self.loginFrame, width = 20)
        self.nameTextEdit.grid(column = 1, row = 0)

        label = Label(self.loginFrame, text = "Phone:")
        label.grid(column = 0, row = 1, sticky = 'W')

        self.phoneTextEdit = Entry(self.loginFrame, width = 20)
        self.phoneTextEdit.grid(column = 1, row = 1)

        self.proxyVar = IntVar()
        self.proxyCheckBox = Checkbutton(self.loginFrame, text="Use Proxy", variable=self.proxyVar, command=self.proxy_checkbox_clicked)
        self.proxyCheckBox.grid(column = 0, row = 2)

        self.proxyFrame = Frame(self.loginFrame)
        self.proxyFrame.grid(column = 0, row = 3)

        label = Label(self.proxyFrame, text = "IP:")
        label.grid(column = 0, row = 0, sticky = 'W')

        self.proxyIPTextEdit = Entry(self.proxyFrame, width = 20)
        self.proxyIPTextEdit.grid(column = 1, row = 0)

        label = Label(self.proxyFrame, text = "Port:")
        label.grid(column = 0, row = 1, sticky = 'W')

        self.proxyPortTextEdit = Entry(self.proxyFrame, width = 20)
        self.proxyPortTextEdit.grid(column = 1, row = 1)

        label = Label(self.proxyFrame, text = "User:")
        label.grid(column = 0, row = 2, sticky = 'W')

        self.proxyUserTextEdit = Entry(self.proxyFrame, width = 20)
        self.proxyUserTextEdit.grid(column = 1, row = 2)

        label = Label(self.proxyFrame, text = "Password:")
        label.grid(column = 0, row = 3, sticky = 'W')

        self.proxyPassTextEdit = Entry(self.proxyFrame, width = 20)
        self.proxyPassTextEdit.grid(column = 1, row = 3)

        self.proxyIPTextEdit.config(state=DISABLED)
        self.proxyPortTextEdit.config(state=DISABLED)
        self.proxyUserTextEdit.config(state=DISABLED)
        self.proxyPassTextEdit.config(state=DISABLED)

        self.addButton = Button(self.loginFrame, text="Login", width = 10)
        self.addButton.grid(column = 0, row = 4)

当我运行它时,我得到了这个框架,知道有什么问题吗?什么不见​​了? 在此处输入图像描述

标签: pythonpython-3.xtkinter

解决方案


您的问题是self.proxyFrame填充了第 1 列self.loginFrame。根据定义,第 2 列中的任何内容都必须位于第 1 列的右侧。一个简单的解决方案是让该框架跨越两列 - 第 1 列和第 2 列。这样,self.proxyFrame不会强制第 1 列与整个框架。

self.proxyFrame.grid(column = 0, row = 3, padx=20, pady=20, columnspan=2)

至于 checkbutton... 默认情况下,小部件在分配给它们的空间中居中grid。如果您希望它左对齐,sticky="w"请在将其添加到网格时添加。

self.proxyCheckBox.grid(column = 0, row = 2, sticky="w")

推荐阅读