Для ясности: если цель состоит в том, чтобы просто напечатать любой текст, отображаемый кнопкой, проще всего иметь отдельные command
функции, как вы это сделали. Тогда становится ясно, какая кнопка была там во время щелчка. Под этим я подразумеваю, просто добавьте оператор print
в функцию stop
.
Но предполагая, что есть более тонкая ситуация, когда вам действительно нужно определить, что упаковано в другой части программы , это пример на основе того, что @ acw1668 предложил в комментариях:
from tkinter import *
packed = 'B1'
def start():
global packed
B1.pack_forget()
B2.pack()
packed = 'B2'
def stop():
global packed
B2.pack_forget()
B1.pack()
packed = 'B1'
def check():
if packed == 'B1':
print("Start")
elif packed == 'B2':
print("Stop")
root = Tk()
root.title("TestWin")
B1 = Button(root, text='start', command=start)
B1.pack(side=TOP)
B2 = Button(root, text='stop', command=stop)
B3 = Button(root, text='check', command=check)
B3.pack(side=BOTTOM)
root.mainloop()
Новая кнопка («проверка») определяет, какая кнопка упакована, на основе флага packed
(просто обратите внимание, если вместо этого вы обернете приложение в class
( см. здесь ), вы можете избежать использования global
).
Вышеупомянутого более чем достаточно , но если вы действительно хотите проверить сам объект кнопки, вы можете проверить упакованные элементы во фрейме с помощью pack_slaves()
:
from tkinter import *
def start():
B1.pack_forget()
B2.pack()
def stop():
B2.pack_forget()
B1.pack()
def check():
global button_frame
button = button_frame.pack_slaves()[0]
text = (button.cget('text'))
if text == 'start':
print('Start')
elif text == 'stop':
print('Stop')
root = Tk()
root.title("TestWin")
button_frame = Frame(root,)
button_frame.pack(side=TOP)
B1 = Button(button_frame, text='start', command=start)
B1.pack()
B2 = Button(button_frame, text='stop', command=stop)
B3 = Button(root, text='check', command=check)
B3.pack(side=BOTTOM)
root.mainloop()
Этот второй пример звучит более похоже на logi c вы описали; т.е. найти объект, соответствующий нажатой кнопке, затем получить его текст, используя cget
, и направить его, чтобы определить, что печатается. Обратите внимание, что в этом примере виджет кнопки обнаруживается с помощью button = button_frame.pack_slaves()[0]
, поэтому предполагается, что явно будет только одна кнопка, упакованная в button_frame
.
Другой вариант - это используйте bind
для программирования эффектов кнопки, а не параметр command
. Затем вы можете создать функцию типа check
в приведенном выше примере для привязки к обеим кнопкам, и вы можете использовать эту технику , чтобы получить нажатый виджет (а затем проверить его личность / текст, определить, что печатать , et c ....).