Tkinter 按钮命令后,标签配置未按预期工作

Tkinter 按钮命令后,标签配置未按预期工作,tkinter,combobox,python-3.6,ttk,Tkinter,Combobox,Python 3.6,Ttk,我正在开发一个GUI,它允许用户从下拉列表中选择一个项目,获取该项目并在代码中的其他地方使用它。这不太管用 from tkinter import * from tkinter import ttk class Root(Tk): def __init__(self): super(Root, self).__init__() self.title("Vibration Certificate Generator") self.minsi

我正在开发一个GUI,它允许用户从下拉列表中选择一个项目,获取该项目并在代码中的其他地方使用它。这不太管用

from tkinter import *
from tkinter import ttk

class Root(Tk):
    def __init__(self):
        super(Root, self).__init__()
        self.title("Vibration Certificate Generator")
        self.minsize(640, 400)
        #self.wm_iconbitmap('icon.ico')
        self.AddMenu()
        self.selectDUT()

    def AddMenu(self):   
        self.dropMenu = Menu()
        self.config(menu=self.dropMenu)

        self.fileMenu = Menu(self.dropMenu, tearoff=0) #file drop down menu
        self.dropMenu.add_cascade(label="File", menu=self.fileMenu)
        self.fileMenu.add_command(label="New Project...", 
        command=self.doNothing)
        self.fileMenu.add_command(label="Now...", command=self.doNothing)
        self.fileMenu.add_separator() #adds line
        self.fileMenu.add_command(label="Exit", command=self.doNothing)

        self.editMenu = Menu(self.dropMenu, tearoff=0) #edit drop down menu
        self.dropMenu.add_cascade(label="Edit", menu=self.editMenu)
        self.editMenu.add_command(label="Undo", command=self.doNothing)
        self.editMenu.add_command(label="Redo", command=self.doNothing)
        self.editMenu.add_separator() #adds line
        self.editMenu.add_command(label="Cut", command=self.doNothing)
        self.editMenu.add_command(label="Copy", command=self.doNothing)
        self.editMenu.add_command(label="Paste", command=self.doNothing)
        self.editMenu.add_command(label="Select All", command=self.doNothing)

        #self.statusBar = ttk.Label(self, text="Generating a certificate for...")
        self.statusBar = ttk.Label(self, text="Generating a certificate for...")
        self.statusBar.grid(column=0,row=4)

    def clickedDUT(self):

        self.statusBar.configure(text="You Have Selected " + self.SelectedDUT.get())
        print(self.SelectedDUT.get())

    def doNothing(self):
        print("ok ok i won't...")

    def selectDUT(self):

        self.SelectedDUT = StringVar()
        #print(self.SelectedDUT.get())
        self.SelectDeviceUnderTest = ttk.Combobox(self, width=30, textvariable=self.SelectedDUT.get())
        self.SelectDeviceUnderTest['values'] = ("ACCELEROMETER", "VELOCITY TRANSDUCER", 
                                  "IMPEDANCE HEAD", "CONDTIONING AMPLIFIER", "VIBRATION ANALYSER", 
                                  "VIBRATION METER", "TRIAXIAL ACCELEROMETER")
        self.SelectDeviceUnderTest.grid(column=1, row=0)
        self.SelectDeviceUnderTest.current(0)

        self.label = ttk.Label(self, text="Select your DUT:")
        self.label.grid(column=0, row=0)

        self.buttonDUT = ttk.Button(self, text="OK", command=self.clickedDUT())
        self.buttonDUT.grid(column=2,row=0) 

root = Root()
root.mainloop()

单击“确定”后,我希望使用从组合框列表选项获得的
SelectedDUT.get()
值更新
clickedDUT()

代码中有两个小部分出错。第一个是如何为组合框设置
文本变量
。您应该直接传递变量,而不是
get
方法:

    def selectDUT(self):

        self.SelectedDUT = StringVar()
        self.SelectDeviceUnderTest = ttk.Combobox(self, width=30, textvariable=self.SelectedDUT)
        ...
第二个错误是您执行命令
self.clickedDUT
,而不是在
self.butndut
中传递引用。更改为:

self.buttonDUT = ttk.Button(self, text="OK", command=self.clickedDUT) #drop the trailing ()
如果希望
self.statusBar
显示在底部,则必须为每行设置权重:

def AddMenu(self):
    ...

    for i in range(1,10):
        self.grid_rowconfigure(i, weight=1)

    self.statusBar = ttk.Label(self, text="Generating a certificate for...")
    self.statusBar.grid(column=0,row=10,columnspan=2,sticky="w")

谢谢@giser_yugang,我还是新来的,我正在学习。谢谢@Henry Yik,这解决了问题。我是Python新手,我仍在努力找到自己的方法。我最不想做的事情是将statusBar标签放在网格的底部(最后一行)。有什么想法吗?可以说,这不是构造GUI的最佳方式,因为在这两者之间会留下很多空白。但是是的,这是可行的。