Python Tkinter网格未按需要设置

Python Tkinter网格未按需要设置,python,python-3.x,tkinter,Python,Python 3.x,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=No

我正在我的应用程序中使用
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)
当我运行它时,我得到了这个框架,你知道问题出在哪里吗?少了什么?
您的问题是
self.proxyFrame
填充了
self.loginFrame
的第1列。根据定义,第2列中的任何内容都必须位于第1列的右侧。一个简单的解决方案是让框架跨越两列—第1列和第2列。这样,
self.proxyFrame
将不会强制第1列与整个帧一样宽

self.proxyFrame.grid(column = 0, row = 3, padx=20, pady=20, columnspan=2)
至于检查按钮。。。默认情况下,小部件集中在
网格
分配给它们的空间中。如果要使其左对齐,请在将其添加到网格时添加
sticky=“w”

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

整个
proxyFrame
占据了
loginFrame
的一列,因此
loginFrame
中所有列号较高的内容都必须位于
proxyFrame
的右侧。一种可能是将
columnspan=2
添加到
proxyFrame
。另一种方法是完全去掉
proxyFrame
,将所有内容都放在一个网格中。将
proxyFrame
列span
增加到
2
。如下所示:
proxyFrame.grid(列=0,行=3,列span=2)