Dodanie listenera do przycisku

0

Cześć,

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

Fragment kodu:

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

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ć.

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.

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/

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:

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ł?

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?

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")
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/

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ę:

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

na

generated = lambda:tk.outputtxt.showinfo("showinfo", generate(entry1.get()))
  • ew. wyrzucę .showinfo
    to będzie działac, ale nic z tego.
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.

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:

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.

0

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

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?

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1