tkinter 网格对齐:Python 2.7
我在添加一个文本框时遇到了网格对齐的问题。
我设置了一个简单的图形界面,宽度有三列。作为这个界面的一部分,我有一个用于输入备注的文本框,还有一个用于定义数字范围的旋转框。
如果我把文本框从代码中去掉,旋转框就能和其他所有元素对齐,但一旦我把文本框放进网格里,旋转框就会向右移动。
旋转框的代码和文本框的位置关系似乎没什么影响,只要文本框在,旋转框就会往右偏移。
到现在为止,我还是看不出问题出在哪里。
我承认我对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)