在Tkinter中点击按钮单击for循环内部

时间:2016-03-22 00:41:43

标签: python python-2.7 tkinter

  1. 我正在尝试根据选项菜单按钮的十进制值创建一个for循环。
  2. 如果选择的选项按钮为2,则for循环循环两次。
  3. 但for循环需要等到for循环中创建的按钮被点击。
  4. 下面的代码显示了相同的内容。
    • 选项菜单的范围为1到10,即用户可以选择要创建的1到10个设备。
    • 选择选项菜单的那一刻,选项菜单的命令按钮即被操作,即comp_gt_data。
    • 这基本上在for循环中循环以获取N个设备的配置。
    • 在完成第一个设备的配置后,我创建了一个"进入下一个设备配置" for循环中的按钮,并希望单击该按钮以获取下一个设备配置。
    • 但是"输入下一个设备...."按钮没有被创建并且在循环中继续循环。
    • 我尝试过使用time.sleep(60),但仍然没有工作。
    • "输入下一个设备.."基本上尝试清除旧设备配置并尝试设置cvadt_val_loop_exit = 0,以便while循环可以退出。
    • QUERY:如何在for循环中基本等待点击按钮继续进行?

  5. self.cvo1 = OptionMenu(root, cvagt_val, *cvagt_list, command=self.comp_gt_data)
        self.cvo1.pack()
    def comp_gt_data(self, *args):
        if cvagt_val.get()!=0:
            cvagt_val_loop = cvagt_val.get()
            for cvagt_loop in range(1, cvagt_val_loop+1):
                self.cvad_l0 = Label(root, text="Enter the %d Device Config"% cvagt_loop)
                self.cvad_l0.pack()
                self.cvad_l1 = Label(root, text="How Many D~S You Want To Create: ")
                self.cvad_l1.pack()
                self.cvad_e1 = Entry(root)
                self.cvad_e1.pack()
                self.cvad_l2 = Label(root, text="How Many MS You Want To Create: ")
                self.cvad_l2.pack()
                self.cvad_e2 = Entry(root)
                self.cvad_e2.pack()
                self.cvad_l3 = Label(root, text="How Many SD You Want To Create: ")
                self.cvad_l3.pack()
                self.cvad_e3 = Entry(root)
                self.cvad_e3.pack()
                if cvagt_loop < cvagt_val_loop:
                    if not (self.cv_next_dev_cfg_button):
                        self.cv_next_dev_cfg_button = Button(root, text="Enter Next Device Configuration", command=self.cv_next_dev_cfg_button_code)
                        self.cv_next_dev_cfg_button.pack()
                    # Waiting For cvadt_val_loop_exit bit to get set when the cv_next_dev_cfg_button is clicked but its not happening and circulating in the while loop
                    cvadt_val_loop_exit = 1
                    while(cvadt_val_loop_exit):
                        print "Waiting For Next Device Config Button To Be Hit"
                        time.sleep(60)
                else:
                    self.cv_next_dev_cfg_button_code()
                    if not (self.return_button):
                        self.return_button = Button(root, text="Return To Main Menu", command=self.return_button_code)
                        self.return_button.pack()
        else:
            print "Choose Atleast One Device To Create"
    def cv_next_dev_cfg_button_code(self):
        if (self.cvad_l0):
            self.cvad_l0.pack_forget(); self.cvad_l0.destroy(); self.cvad_l0 = None
        if (self.cvad_l1):
            self.cvad_l1.pack_forget(); self.cvad_l1.destroy(); self.cvad_l1 = None
        if (self.cvad_l2):
            self.cvad_l2.pack_forget(); self.cvad_l2.destroy(); self.cvad_l2 = None
        if (self.cvad_l3):
            self.cvad_l3.pack_forget(); self.cvad_l3.destroy(); self.cvad_l3 = None
        if (self.cvad_e1):
            self.cvad_e1.pack_forget(); self.cvad_e1.destroy(); self.cvad_e1 = None
        if (self.cvad_e2):
            self.cvad_e2.pack_forget(); self.cvad_e2.destroy(); self.cvad_e2 = None
        if (self.cvad_e3):
            self.cvad_e3.pack_forget(); self.cvad_e3.destroy(); self.cvad_e3 = None
        if (self.cv_next_agt_cfg_button):
            self.cv_next_agt_cfg_button.pack_forget(); self.cv_next_agt_cfg_button.destroy(); self.cv_next_agt_cfg_button = None
        cvadt_val_loop_exit = 0
    

1 个答案:

答案 0 :(得分:0)

for()不是这里的答案。而是将函数调用正确的次数,并等待多长时间。这应该足以让你开始。

try:
    import Tkinter as tk     ## Python 2.x
except ImportError:
    import tkinter as tk     ## Python 3.x

class ButtonForLoop():
    def __init__(self, top):
        self.top=top
        self.but_1=tk.Button(top, text="Start for()", command=self.start_for)
        self.but_1.grid(row=0, column=0)

        self.num_for=0
        ## for simplicity, assume 3 iterations through the loop
        self.max_num=3

    def next_pass(self):
        ## create button again
        self.but_1=tk.Button(top, text="Pass # %d" % (self.num_for),
                             command=self.start_for)
        self.but_1.grid(row=0, column=0)

    def start_for(self):
        """ button clicked so call next_pass() the correct
            number of iterations
        """
        ## destroy whatever button is showing
        self.but_1.destroy()
        if self.num_for < self.max_num:
            self.num_for += 1
            self.top.after(500, self.next_pass)
        else:
            self.top.quit()

top=tk.Tk()
BF=ButtonForLoop(top)
top. mainloop()