【问题标题】:How to make state of window idle until button is pressed in python tkinter?python - 如何在python tkinter中按下按钮之前使窗口处于空闲状态?
【发布时间】:2016-04-29 03:35:00
【问题描述】:

我有一个带有开始按钮的窗口,并在不同的框架中设置了一些小部件。现在我想让窗口空闲(禁用状态),直到单击“开始”按钮。帮我解决这个问题。我的代码是如下

from tkinter import *



class Application(Frame):

def __init__(self,  master):
    super(Application,self).__init__(master)
    self.grid()
    self.create_widgets()

  def create_widgets(self):
    self.be=Button(self,text="start")
    self.be.grid(row=1,column=1,sticky="s")

    self.columnconfigure(0, pad=3)
    self.columnconfigure(1, pad=3)
    self.columnconfigure(2, pad=3)
    self.columnconfigure(3, pad=3)

    self.rowconfigure(0, pad=5)
    self.rowconfigure(1, pad=5)
    self.f3=Frame(self)
    self.f3.grid(row=2,column=1)
    fuel = Button(self.f3, text="Button",width=19)
    fuel.grid(row=1, column=0)
    Temp = Button(self.f3, text="Button",width=19)
    Temp.grid(row=1, column=1)
    Th = Button(self.f3,text="Button",width=19)
    Th.grid(row=1, column=2)    
    Eo = Button(self.f3, text="Button",width=19)
    Eo.grid(row=1, column=3)

    Bh = Button(self.f3, text="Button",width=19)
    Bh.grid(row=2, column=0)        
    Abs = Button(self.f3, text="Button",width=19)
    Abs.grid(row=2, column=1)         
    sp = Button(self.f3, text="Button",width=19)
    sp.grid(row=2, column=2) 
    fo = Button(self.f3, text="Button",width=19)
    fo.grid(row=2, column=3) 

root= Tk()
app=Application(root)
app.mainloop()

【问题讨论】:

    标签: python python-3.x user-interface tkinter


    【解决方案1】:

    您宁愿需要遍历小部件并一个一个地禁用它们,因为您不能像那样禁用整个Frame 对象。

    因此您需要使用winfo_children() 来探测子小部件。

    然后您需要使用command 回调向self.be 按钮附加一个方法,以再次启用子小部件。

    完整程序

    这是您正在寻找的程序:

    '''
    Created on Apr 29, 2016
    
    @author: billal begueradj
    '''
    from tkinter import *
    
    class Application(Frame):
    
       def __init__(self,  master):
           super(Application,self).__init__(master)
           self.grid()
           self.create_widgets()
    
       def create_widgets(self):
           self.be=Button(self,text="start", command = self.enable_widgets)
           self.be.grid(row=1,column=1,sticky="s")
    
           self.columnconfigure(0, pad=3)
           self.columnconfigure(1, pad=3)
           self.columnconfigure(2, pad=3)
           self.columnconfigure(3, pad=3)
    
           self.rowconfigure(0, pad=5)
           self.rowconfigure(1, pad=5)
           self.f3=Frame(self)
           self.f3.grid(row=2,column=1)
           fuel = Button(self.f3, text="Button",width=19)
           fuel.grid(row=1, column=0)
           Temp = Button(self.f3, text="Button",width=19)
           Temp.grid(row=1, column=1)
           Th = Button(self.f3,text="Button",width=19)
           Th.grid(row=1, column=2)    
           Eo = Button(self.f3, text="Button",width=19)
           Eo.grid(row=1, column=3)
    
           Bh = Button(self.f3, text="Button",width=19)
           Bh.grid(row=2, column=0)        
           Abs = Button(self.f3, text="Button",width=19)
           Abs.grid(row=2, column=1)         
           sp = Button(self.f3, text="Button",width=19)
           sp.grid(row=2, column=2) 
           fo = Button(self.f3, text="Button",width=19)
           fo.grid(row=2, column=3) 
           for child in self.f3.winfo_children():
               child.configure(state = 'disable')
    
    
       def enable_widgets(self):
           '''Enable the child widgets'''
           for child in self.f3.winfo_children():
               child.configure(state = 'normal')
    
    
    root= Tk()
    app=Application(root)
    app.mainloop()
    

    演示

    在程序开始时,GUI 将如下所示:

    点击Start按钮后:

    【讨论】:

    • 我还有一个查询。在上面的程序中,每个按钮执行单独的功能。单击按钮新窗口将打开,这是一个子类。现在我想同时执行每个按钮的功能。例如如果我点击button1,即使我点击button2,它也应该继续接受来自文件的输入并给出输出。我可以在这里使用线程概念吗?如果可以,你能告诉我怎么做吗?
    • 这样的事情用线程是没用的。只需使用 command 选项 将这些回调方法附加到按钮
    • 我试过了,但是如果我同时按下两个按钮,这两个功能将无法同时工作@Billal
    • 但是你怎么能同时点击两个按钮呢?这是不可能的:)
    • 那是真的,但例如,如果我点击 button1,它收集来自某个传感器的读数并将其显示在 gui 上,现在如果我点击 button2,它做同样的事情。当我点击第二个按钮时button1 的结果也应该继续显示结果,而第二个按钮的结果也应该显示,直到两者都被用户终止。
    猜你喜欢
    • 2018-09-19
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2018-06-30
    • 1970-01-01
    • 2019-09-19
    相关资源
    最近更新 更多