Dodanie listenera do przycisku

Dodanie listenera do przycisku
AD
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:10
0

Cześć,

Chcialbym przypisać funkcję do przycisku, ale nie wiem czy w dobrym kierunku zmierzam.

Fragment kodu:

Kopiuj
def generate(code):
  splitted = code.split()
  print(splitted)
  result = []
  result += [splitted[7]]
  result += [splitted[6]]
  result += [splitted[5]]
  result += [splitted[4]]
  result += [splitted[9]]
  result += [splitted[8]]
  print(result)
  return " ".join(result)
 
generated = generate("78 43 69 56 20 ee 59 c6 94 4c fe 35 46 91 f2 59")
print(generated)
 

insertcode1 = tk.Label(root,  text = "Insert")
insertcode1.pack(side=LEFT)
 
entry1 = tk.Entry(root)
entry1.pack(side=LEFT)
 
buttonGenerate = tk.Button(root, relief = "ridge", text = "Generate", width = 20, height = 5, command = generate).pack()

Chodzi o to, aby po wpisaniu pewnego kodu w pole entry field i po naciśnięciu przycisku generate, zadziałała mi powyższa funkcja i wygenerowała nowy kod i go wyświetliła (np w pop up window albo w jakimś miejscu w oknie)

Z góry dziękuję za pomoc

edytowany 3x, ostatnio: Riddle
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około godziny
  • Postów:6687
1

https://www.pythontutorial.net/tkinter/tkinter-button/
Callback nie powinien mieć argumentów.

Jeśli wszystko inne jest ok i zmienisz:

  • command = generate na command = generated
  • generated = generate("78 43 69 56 20 ee 59 c6 94 4c fe 35 46 91 f2 59") na generated = lambda: tk.messagebox.showinfo("showinfo", generate("78 43 69 56 20 ee 59 c6 94 4c fe 35 46 91 f2 59")

to powinno działać.


🕹️⌨️🖥️🖱️🎮
AD
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:10
0

@Spine: dzięki za feedback. Jest jakiś progres, bo faktycznie wyskoczyło pop up window z wynikiem. Problem w tym, że gdy wpisuje inny kod i klikam generate, to mam ten sam wynik :p

Dodatkowo zależałoby mi, aby wynik wyskoczył w takiej formie, abym mógł go łatwo skopiować. W tym momencie to nie jest możliwe.

edytowany 1x, ostatnio: adisc
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około godziny
  • Postów:6687
0
adisc napisał(a):

Problem w tym, że gdy wpisuje inny kod i klikam generate, to mam ten sam wynik :p

@adisc: to Twoja lambda powinna używać kodu wczytanego z pola edycji.
generated = lambda: tk.messagebox.showinfo("showinfo", generate(text_box.get(1.0, 'end'))

adisc napisał(a):

Dodatkowo zależałoby mi, aby wynik wyskoczył w takiej formie, abym mógł go łatwo skopiować. W tym momencie to nie jest możliwe.

Nie ma takiego messageboxa w Tkinter => https://stackoverflow.com/a/35947543
Sugerowałbym zrobienie dwóch przycisków w głównym okienku.
Jeden, który pokazuje wynik. (już jest)
Drugi, który zapisuje wynik do schowka => https://www.codingem.com/copy-text-to-clipboard-in-python/


🕹️⌨️🖥️🖱️🎮
edytowany 2x, ostatnio: Spine
AD
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:10
0
Spine napisał(a):
adisc napisał(a):

Problem w tym, że gdy wpisuje inny kod i klikam generate, to mam ten sam wynik :p

@adisc: to Twoja lambda powinna używać kodu wczytanego z pola edycji.
generated = lambda: tk.messagebox.showinfo("showinfo", generate(text_box.get(1.0, 'end'))

adisc napisał(a):

Dodatkowo zależałoby mi, aby wynik wyskoczył w takiej formie, abym mógł go łatwo skopiować. W tym momencie to nie jest możliwe.

Nie ma takiego messageboxa w Tkinter => https://stackoverflow.com/a/35947543
Sugerowałbym zrobienie dwóch przycisków w głównym okienku.
Jeden, który pokazuje wynik. (już jest)
Drugi, który zapisuje wynik do schowka => https://www.codingem.com/copy-text-to-clipboard-in-python/

Cześć. Wracam z tematem. Generalnie udało mi się przypisać prawidłową funkcję do przycisku i po jego kliknięciu messagebox wyrzuca mi poprawną wartość. Zostaje kwestia skopiowania tej wartości i tak pomyślałem czy dałoby się zrobić tak, aby wygenerowana wartość pojawiła się w innym entry field, który będzie miał state jako readonly. Przesyłam kawałek kodu:

Kopiuj
insertcode1 = tk.Label(root,  text = "Insert SECRET CODE")
insertcode1.pack(side=LEFT)

entry1 = tk.Entry(root)
# entry1.config(bg = "grey")
entry1.pack(side=LEFT)

generatedimmoSK = tk.Label(root, text = "Generated IMMO SK")
generatedimmoSK.pack(side=LEFT)

generated = lambda:tk.messagebox.showinfo("showinfo", generate(entry1.get()))

entry2 = tk.Entry(root, state = 'readonly')
entry2.pack(side=LEFT)

Chciałbym zrobić tak, aby wygenerowana wartość pojawiła mi się w entry2. Jakiś pomysł?

edytowany 2x, ostatnio: Riddle
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około godziny
  • Postów:6687
0

🕹️⌨️🖥️🖱️🎮
AD
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:10
0

Trochę pokminiłem i zrobiłem to z dwoma text widgetami. w miejsce input wklejam wartość i po naciśnięciu generate chciałbym, aby nwoa wartość pojawiła się w miejscu output, ale niestety tutaj utknąłem. Jak pokazać tę wartość w output?

Kopiuj
input = Label(text = "Insert SECRET CODE HERE")
inputtxt = Text(root, height = 10, width = 25, bg = "light yellow")
input.pack()
inputtxt.pack()

output = Label (text = "Generated IMMO SK")
outputtxt = Text(root, height = 5, width = 25, bg = "light cyan")
output.pack()
outputtxt.pack()

# entry1 = tk.Entry(root)
# # entry1.config(bg = "grey")
# entry1.pack(side=LEFT)

# generatedimmoSK = tk.Label(root, text = "Generated IMMO SK")
# generatedimmoSK.pack(side=LEFT)

generated = lambda:("showinfo", generate(inputtxt.get("1.0",'end-1c')))

# entry2 = tk.Entry(root, state = 'readonly')
# entry2.pack(side=LEFT)

buttonGenerate = tk.Button(root, relief = "ridge", text = "Generate", width = 20, height = 5, command = generated).pack() 
# # buttonGenerate.config(bg = "yellow")
edytowany 1x, ostatnio: adisc
Tasmanian Devil
Twój post prawdopodobnie zawiera niesformatowany kod - nie wklejaj bezpośrednio kodu, ale obejmuj go w odpowiednie znaczniki! (jestem botem, ten komentarz został dodany automatycznie) /cc @cerrato
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około godziny
  • Postów:6687
0

Wklejanie kodu tak jak wklejasz jest niezgodne z regulaminem.

Mam wrażenie, że programujesz nie zastanawiając się zbytnio jak działa to co piszesz...
Masz przycisk, który wykonuje komendę generowania łańcucha znaków, który to łańcuch wysyłany jest do messagebox.
To jaki dla Ciebie problem stanowi wysłanie tego łańcucha znaków do kontrolki Text, Label, czy dowolnej innej!?

Wystarczy wygooglować, jak ustawić tekst danej kontrolki!
https://www.delftstack.com/howto/python-tkinter/how-to-set-text-of-tkinter-text-widget-by-using-a-button/


🕹️⌨️🖥️🖱️🎮
edytowany 1x, ostatnio: Spine
AD
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:10
0
Spine napisał(a):

Wklejanie kodu tak jak wklejasz jest niezgodne z regulaminem.

Mam wrażenie, że programujesz nie zastanawiając się zbytnio jak działa to co piszesz...
Masz przycisk, który wykonuje komendę generowania łańcucha znaków, który to łańcuch wysyłany jest do messagebox.
To jaki dla Ciebie problem stanowi wysłanie tego łańcucha znaków do kontrolki Text, Label, czy dowolnej innej!?

Wystarczy wygooglować, jak ustawić tekst danej kontrolki!
https://www.delftstack.com/howto/python-tkinter/how-to-set-text-of-tkinter-text-widget-by-using-a-button/

Chyba się pogubiłem. Myślałem, że jesli zmienię:

Kopiuj
generated = lambda:tk.messagebox.showinfo("showinfo", generate(entry1.get()))

na

Kopiuj
generated = lambda:tk.outputtxt.showinfo("showinfo", generate(entry1.get()))
  • ew. wyrzucę .showinfo
    to będzie działac, ale nic z tego.
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około godziny
  • Postów:6687
0

No zbłądziłeś...

outputtxt to zmienna, którą tworzysz.
Ta zmienna nie posiada metody showinfo, ani też nie należy do przestrzeni nazw tk.

Twoja lambda ma ustawiać łańcuch znaków generate(entry1.get()) jako tekst kontrolki outputtxt.
Poza tym nic więcej Ci nie powiem, bo pewnie nawet nie zajrzałeś na linka, który podałem, a masz tam przykład jak ustawić tekst kontrolki typu Text.


🕹️⌨️🖥️🖱️🎮
edytowany 2x, ostatnio: Spine
AD
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:10
0
Spine napisał(a):

No zbłądziłeś...

outputtxt to zmienna, którą tworzysz.
Ta zmienna nie posiada metody showinfo, ani też nie należy do przestrzeni nazw tk.

Twoja lambda ma ustawiać łańcuch znaków generate(entry1.get()) jako tekst kontrolki outputtxt.
Poza tym nic więcej Ci nie powiem, bo pewnie nawet nie zajrzałeś na linka, który podałem, a masz tam przykład jak ustawić tekst kontrolki typu Text.

Ok, udało się. Dzięki za cierpliwość :)

nad jedną rzeczą ubolewam, a mianowicie w tym drugim oknie, gdzie pokazuje mi się finalna wartość, to w momencie gdy ustawiam state = "disabled", to funkcja nie działa. Zakładam, że dzieje się tak przez ten fragment:

Kopiuj
def setTextInput(text):
    textExample.delete(1.0,"end")
    textExample.insert(1.0, text)

Zastsanawiam sie jeszcze czy można to jakoś obejść. Nie jest to duży problem, ale pracując nad tym programem, po prostu uczę się pythona i rozkminiam różne przypadki.

Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około godziny
  • Postów:6687
0

Może zmień na enabled, a po zmianie tekstu znowu zmień na disabled?


🕹️⌨️🖥️🖱️🎮
AD
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:10
0
Spine napisał(a):

Może zmień na enabled, a po zmianie tekstu znowu zmień na disabled?

powinienem wrzucić to jakoś w tej funkcji setextinput?

Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około godziny
  • Postów:6687
0

@adisc: No przecież...
przed delete i po insert


🕹️⌨️🖥️🖱️🎮

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.