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完成了解决方案。我现在清楚地知道出了什么问题!