tkinter 网格对齐:Python 2.7

2 投票
1 回答
1249 浏览
提问于 2025-04-18 18:22

我在添加一个文本框时遇到了网格对齐的问题。

我设置了一个简单的图形界面,宽度有三列。作为这个界面的一部分,我有一个用于输入备注的文本框,还有一个用于定义数字范围的旋转框。

如果我把文本框从代码中去掉,旋转框就能和其他所有元素对齐,但一旦我把文本框放进网格里,旋转框就会向右移动。

旋转框的代码和文本框的位置关系似乎没什么影响,只要文本框在,旋转框就会往右偏移。

到现在为止,我还是看不出问题出在哪里。

我承认我对Tkinter(还有StackOverflow)都是新手。

下面这行代码就是导致问题的原因:

self.newText.grid(row=display_row, column=0, columnspan=4, padx=10, pady=10).

下面是示例代码。如果我把上面那行注释掉,旋转框就能正确对齐;如果那行代码在,旋转框就会偏移。只有旋转框受到影响,标签、输入框、单选按钮和文本框都没有问题,但旋转框却出现了偏移。这些是我图形界面所需的唯一控件。

任何帮助都非常感谢。

#-------------------------------------------------------------------------------
# Name:        MyGUI
# Purpose:     Problem Sample
#
#-------------------------------------------------------------------------------


from Tkinter import *

#===============================
# GUI Class
#===============================

class GUIClass():
    '''
    GUI class
    '''
    def __init__(self):
        self.displayframe   = 0
        self.NameVar        = StringVar()
        self.NumVar         = StringVar()   # shouldn't be but it works
        self.ButtonVar      = BooleanVar()

    #===============================
    # Function for standard button
    def StandardEntry(self,  display_row,labeltext,entryvar):
        '''
        Standard 'Entry' feature for GUI.
        '''
        Label(self.displayframe, text=labeltext).grid(row=display_row, column=0, sticky=W)
        name = Entry(self.displayframe, textvariable=entryvar)
        name.grid(row=display_row, column=1, sticky=W)
        display_row+=1

    def BooleanRadioButton(self, display_row, labeltext, entryvar):
        '''
        Boolean true/false radio button function
        '''
        Label(self.displayframe, text=labeltext).grid(row=display_row, column=0, sticky=W)
        ButtonOn = Radiobutton(self.displayframe, text="Enabled", variable=entryvar, value=True)
        ButtonOn.grid(row=display_row, column=1, sticky=W)
        ButtonOn = Radiobutton(self.displayframe, text="Disabled", variable=entryvar, value=False)
        ButtonOn.grid(row=display_row, column=2, sticky=W)

    def StandardSpinBox(self, display_row, labeltext, min_value, max_value, variablename):
        '''
        Standard spinbox for this project.
        '''
        Label(self.displayframe, text=labeltext).grid(row=display_row, column=0, sticky=W)
        spinboxwidget = Spinbox(self.displayframe, from_=min_value, to=max_value, textvariable=variablename)
        spinboxwidget.grid(row=display_row, column=1)

    def AddFreeTextForm(self, display_row, notes):
        '''
        Standard widget for free text entry
        '''
        self.newText = Text(self.displayframe, width=50, height=8, takefocus=0)
        self.newText.grid(row=display_row, column=0, columnspan=4, padx=10, pady=10)

    def movesettingstoclass(self, dataclass):
        dataclass.NameVar       = self.NameVar.get()
        dataclass.NumVar        = int(self.NumVar.get())
        dataclass.ButtonVar     = self.ButtonVar.get()


    def populate(self, dataclass):
        '''
        Takes the data in the data structure and populates the GUI.
        '''
        self.NameVar.set(dataclass.NameVar)
        self.NumVar.set(str(dataclass.NumVar))
        self.ButtonVar.set(dataclass.ButtonVar)

#===============================
# Data Class
#===============================
class DataClass():

    def __init__(self):
        self.NameVar         = 'SomeName'
        self.NumVar          = 11
        self.ButtonVar       = False

    def showvalues(self):
        '''
        Debug function/method for checking values are set correctly.
        '''

        msg += 'NameVar    :     %s\n' %self.NameVar
        msg += 'NumVar     :     %d\n' %self.NumVar
        msg += 'KVVar      :     %d\n' %self.KVVar
        if self.ButtonVar == True:
            msg += 'ButtonVar:     True\n'
        else:
            msg += 'ButtonVar:     False\n'

        print msg


#=============================================
# Main window
#=============================================
root = Tk()

MyData = DataClass()
mainGUI = GUIClass()

root.title('Problem Example')
menu = Menu(root)
root.config(menu=menu)


#==============================================================================
# text fields to be entered by the user...

display_row = 0
Notes = ''

mainGUI.displayframe = Frame(root)

#==============================================================================
# Some entry input parameter

mainGUI.StandardEntry(display_row, "Some Label", mainGUI.NameVar)
display_row+=1

#==============================================================================
# Some spinbox input parameter

mainGUI.StandardSpinBox(display_row, "Some Label", 3, 21, mainGUI.NumVar)
display_row+=1

#==============================================================================
# Some Radiobutton input parameter

SwitchOn = mainGUI.BooleanRadioButton(display_row, "Button Label", mainGUI.ButtonVar)
display_row+=1

Label(mainGUI.displayframe, text="Configuration Notes").grid(row=display_row, column=1, sticky=W)
display_row += 1

#notes = mainGUI.AddFreeTextForm(display_row, "Configuration Notes", MyData.Notes)
notes = mainGUI.AddFreeTextForm(display_row, Notes)
display_row+=1

mainGUI.displayframe.pack(anchor='w')

#==============================================================================
# and the magic all happens here
mainloop()

1 个回答

3

你在调用spinbox的grid方法时,忘记设置sticky这个参数了。

spinboxwidget.grid(row=display_row, column=1, sticky=W)

撰写回答