Могу ли я получить текст на кнопке при изменении после нажатия на нее в Python? - PullRequest
0 голосов
/ 18 июня 2020

Вот пример того, что я пытаюсь передать:

from tkinter import *

def start():
    print("Start")
    B1.pack_forget()
    B2.pack()


def stop():
    B2.pack_forget()
    B1.pack()

root = Tk()
root.title("TestWin")

B1 = Button(root, text='start', command=start)
B1.pack()
B2 = Button(root, text='stop', command=stop)

root.mainloop()

Теперь я хочу использовать if logi c, чтобы получить имя кнопки, которая в данный момент упакована. И это может выглядеть примерно так:

if <<em> button_text_keyword > == 'start', затем print ('Start') elif <<em> button_text_keyword > == "стоп", затем печать ("Стоп").

Это можно сделать ??? Или мне нужно вводить длинный код, чтобы добиться этого ???

Пожалуйста, предложите хороший способ сделать то, что я хочу, или исправьте меня.

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Для ясности: если цель состоит в том, чтобы просто напечатать любой текст, отображаемый кнопкой, проще всего иметь отдельные 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 ....).

0 голосов
/ 18 июня 2020

Если вы хотите, чтобы при нажатии кнопки текст вашей кнопки изменился, попробуйте # this

from tkinter import *
root = Tk()
root.title("title")

def start():
    #for changing text on button
    button_name.config(text="new text on button")

B1 = Button(root, text='start', command=start)
B1.pack()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...