Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.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_Class_Tkinter_Parameter Passing_Class Variables - Fatal编程技术网

Python 如何将单击哪个按钮的信息传递到另一个类中?

Python 如何将单击哪个按钮的信息传递到另一个类中?,python,class,tkinter,parameter-passing,class-variables,Python,Class,Tkinter,Parameter Passing,Class Variables,我已经搜索和阅读了,但不太理解其他帖子,或者它并没有反映出我的问题 我在类似的帖子中尝试过不同的东西,比如这篇:,但很明显,我不理解课程,正如可以看出的那样,我是一个绝对的初学者 from tkinter import Tk, ttk, Frame, Label, StringVar, OptionMenu, Entry, Button, Toplevel import pymysql as mdb from functools import partial from PIL import Im

我已经搜索和阅读了,但不太理解其他帖子,或者它并没有反映出我的问题

我在类似的帖子中尝试过不同的东西,比如这篇:,但很明显,我不理解课程,正如可以看出的那样,我是一个绝对的初学者

from tkinter import Tk, ttk, Frame, Label, StringVar, OptionMenu, Entry, Button, Toplevel
import pymysql as mdb
from functools import partial
from PIL import Image, ImageTk

class Home(object):
    def __init__(self, master):
        self.master = master
        self.master.title("Control Panel")
        self.master.configure(background="#%02x%02x%02x" % (61, 72, 73))
        self.master.geometry("475x190")
        self.master.resizable(width=False, height=False)
        self.main_frame = Frame(master, background="#%02x%02x%02x" % (61, 72, 73))
        self.main_frame.grid(row=1, column=1, columnspan=4, padx=15, pady=15)
        load1 = Image.open('plan.jpg')
        render1 = ImageTk.PhotoImage(load1)
        self.button_plan = Button(self.main_frame, image=render1, command=self.b_clicked('Planning'))
        self.button_plan.image = render1
        self.button_plan.grid(row=1, column=1, padx=12)
        self.label_plan = Label(self.main_frame, text='Planning', font='Calibri 9',
                            background="#%02x%02x%02x" % (61, 72, 73),
                            foreground="#%02x%02x%02x" % (255, 201, 14))
        self.label_plan.grid(row=2, column=1, padx=12)
        load2 = Image.open('consumption.jpg')
        render2 = ImageTk.PhotoImage(load2)
        self.button_consumption = Button(self.main_frame, image=render2, command=self.b_clicked('Consumption'))
        self.button_consumption.image = render2
        self.button_consumption.grid(row=1, column=2, padx=12)
        self.label_consumption = Label(self.main_frame, text='Consumption', font='Calibri 9',
                                   background="#%02x%02x%02x" % (61, 72, 73),
                                   foreground="#%02x%02x%02x" % (255, 201, 14))
        self.label_consumption.grid(row=2, column=2, padx=12)


    def b_clicked(self, id):
        self.button_id = id
        self.master.withdraw()
        self.second_w = Toplevel(self.master)
        self.app = Second(self.second_w, self.button_id)


class Second(object):
    def __init__(self, master, arg1):
        self.master = master
        self.master.title("Second")
        self.master.configure(background="#%02x%02x%02x" % (61, 72, 73))
        self.master.geometry("190x165")
        self.master.resizable(width=False, height=False)
        print(arg1)

root = Tk()
GUI = Home(root)
root.mainloop()
我想将一个变量值传递到另一个类中。在这种情况下,我希望将self.button_id值“Planning”从课堂主页传递给第二课堂。重点是。。。我不需要解决问题。我真的很想了解它,这将是一个很好的机会,学习它对我自己的例子

有几件事:

我减少了你的代码,去掉了所有没有问题的代码

创建按钮时,命令参数将运行回调函数,而不仅仅是分配回调函数

command=self.b_clicked('Planning')   # Will run self.b_clicked
相反,您可以在此赋值中使用lambda表达式:

command=lambda:self.b_clicked('Planning')
简言之:函数名为self.b_clicked,通常您会指定command=self.b_clicked,但当您要传递参数时,必须使用lambda或partial,因为用括号结束函数名只会运行函数

创建两个按钮时,程序会立即创建两个新的顶级窗口。在第二个窗口中重复使用名称self.second_w时,也会丢失对第一个顶级窗口的引用

此外,您使用的变量名称id不好,因为id是一个内置函数

否则,它似乎工作得很好:

from tkinter import *

class Home():
    def __init__(self, master):
        self.master = master
        self.main_frame = Frame(master, bg='tan')
        self.main_frame.pack()

        self.button_plan = Button(self.main_frame, text='Plan', 
                                  command=lambda:self.b_clicked('Planning'))
        self.button_plan.grid(row=1, column=1, padx=12)

    def b_clicked(self, idty):      # "id" is a builtin function
        self.button_id = idty
        self.master.withdraw()
        self.second_w = Toplevel(self.master)
        self.app = Second(self.second_w, self.button_id)

class Second():
    def __init__(self, master, arg1):
        self.master = master
        self.master.configure(bg='tomato')
        print(arg1)

root = Tk()
GUI = Home(root)
root.mainloop()

Passwordid?我不太明白传递self.second\u w和传递idor self.button\u id之间有什么区别?假设second不是一个类,而是一个函数。我想从类主页获取self.button_id值“Planning”,并将其传递给函数Second。你们知道怎么做,不是吗?猜猜self。b_点击“计划”是做什么的。我要感谢@Goyo为我指明了正确的方向并展示了显而易见的。感谢@figbeam完成了解决方案。我现在清楚地知道出了什么问题!