Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成的按钮出现在错误的窗口中_Python_Tkinter - Fatal编程技术网

Python 生成的按钮出现在错误的窗口中

Python 生成的按钮出现在错误的窗口中,python,tkinter,Python,Tkinter,我开始学习Python,我发现了一个在任何教程中都没有讨论过的问题 基本上,当程序变得更复杂时,我已经失去了控制新元素出现位置的能力。很难为我解释,因为英语不是我的母语,所以我制作了一个模拟程序,显示我的主程序有什么问题 import Tkinter as tk import ttk as ttk clutter=['1PLACEHOLDER', '2PLACEHOLDER', '3PLACEHOLDER', 'PICK ME'] class GRAPHIC_INTERFACE(tk.Fra

我开始学习Python,我发现了一个在任何教程中都没有讨论过的问题

基本上,当程序变得更复杂时,我已经失去了控制新元素出现位置的能力。很难为我解释,因为英语不是我的母语,所以我制作了一个模拟程序,显示我的主程序有什么问题

import Tkinter as tk
import ttk as ttk

clutter=['1PLACEHOLDER', '2PLACEHOLDER', '3PLACEHOLDER', 'PICK ME']

class GRAPHIC_INTERFACE(tk.Frame):
    def __init__(self,*args):
        tk.Frame.__init__(self, *args)
        self.grid()
        self.first_window()

    def first_window(self):
        self.button1=tk.Button(self, text="PLACEHOLDER")
        self.button1.grid()
        self.button2=tk.Button(self, text="CLICK ME", command=self.second_window)
        self.button2.grid()
        self.button3=tk.Button(self, text="PLACEHOLDER")
        self.button3.grid()
        #the additional button apears here

    def second_window(self):
        alpha=tk.Toplevel(self)
        self.button4=tk.Button(alpha, text="PLACEHOLDER")
        self.button4.grid()
        self.button5=tk.Button(alpha, text="CLICK ME", command= self.third_window)
        self.button5.grid()

    def third_window(self):
        beta=tk.Toplevel(self)
        self.BOXXY=ttk.Combobox(beta, values= clutter, state='readonly')
        self.BOXXY.bind("<<ComboboxSelected>>", self.misplaced_button)     #after choosing the third option an aditional button is created
        self.BOXXY.current(0)
        self.BOXXY.grid()
        self.button6=tk.Button(beta, text="PLACEHOLDER")
        self.button6.grid()
        #the additional button needs to appear here

    def misplaced_button(self, *args):
        Catie=self.BOXXY.get()
        if Catie=='PICK ME':
            self.button7=tk.Button(self, text="I am that problematic button")#this button needs to be in the third window
            self.button7.grid()
        else:
            print "that was not the chosen one"

root=tk.Tk()
root.title("Mockup")
root.geometry("180x200")
app=GRAPHIC_INTERFACE(root)
root.mainloop()
将Tkinter作为tk导入
将ttk作为ttk导入
杂乱=['1PLACEHOLDER','2PLACEHOLDER','3PLACEHOLDER','PICK ME']
类图形界面(tk.框架):
定义初始化(self,*args):
tk.Frame.\uuuu init\uuuu(self,*args)
self.grid()
self.first_window()
def第一个_窗口(自):
self.button1=tk.Button(self,text=“占位符”)
self.button1.grid()
self.button2=tk.Button(self,text=“单击我”,command=self.second\u窗口)
self.button2.grid()
self.button3=tk.Button(self,text=“占位符”)
self.button3.grid()
#附加按钮显示在这里
def第二个_窗口(自):
alpha=tk.顶层(自身)
self.button4=tk.Button(alpha,text=“占位符”)
self.button4.grid()
self.button5=tk.Button(alpha,text=“单击我”,command=self.third\u窗口)
self.button5.grid()
def第三个_窗口(自):
贝塔=传统顶级(自我)
self.BOXXY=ttk.Combobox(beta,value=croot,state='readonly')
self.BOXXY.bind(“,self.misplaced_按钮)#选择第三个选项后,将创建一个传统按钮
自组装箱XY.电流(0)
self.BOXXY.grid()
self.button6=tk.Button(beta,text=“占位符”)
self.button6.grid()
#需要在此处显示附加按钮
def错位按钮(自身,*参数):
Catie=self.BOXXY.get()
如果Catie==‘选择我’:
self.button7=tk.Button(self,text=“我就是那个有问题的按钮”)#这个按钮需要在第三个窗口中
self.button7.grid()
其他:
打印“不是所选的”
root=tk.tk()
根标题(“模型”)
根几何(“180x200”)
app=图形界面(根)
root.mainloop()

起初,我认为我可以通过给小部件命名(即alpha、beta)来控制它们的位置,但显然我错了。

如果
self.button7
应该在第三个窗口中,你所要做的就是使用第三个窗口作为按钮的父窗口

您可以通过多种方式实现这一点:可以将窗口保存为属性,可以在调用函数时传入窗口,也可以根据捕获事件的窗口计算窗口

下面是一个解决方案,它将按钮置于获取事件的顶层:

def misplaced_button(self, event):
    ...
        toplevel = event.widget.winfo_toplevel()
        self.button7=tk.Button(toplevel,...)
    ...

当程序运行时,为了查看此问题,我们应该怎么做?“单击我”在1窗口上,“单击我”在新窗口上,在第三个窗口的commbobox上选择最后一个选项后,错误放置的按钮将在第一个窗口中出现。这就是问题所在