Python Tkinter GUI button reset

0

Witajcie,

Generalnie zaczynam dopiero swoją przygodę z Pythonem i natknąłem się na pewien problem. Piszę coś ala "testownik" do zajęć z biochemii, ale mniejsza z tym. :)
Potrzebuję zrobić button, który zmieniałby dany aminokwas. Dajmy na to, program wygenerował alaninę. Button sprawiałby, że losowanie byłoby raz jeszcze. Docelowo ma być bodaj 20 aminokwasów, więc proszę się nie sugerować ilością - to tylko dla testów tyle podałem.
Oto kod:

import tkinter as tk
from functools import partial
import random
import tkinter.messagebox
from tkinter import *
import tkinter

x = random.choice( ["alanina", "tyrozyna"] )

def call_result(label_result, jednoliterowy, trzyliterowy):
    jednoliterowy = (jednoliterowy.get())
    trzyliterowy = (trzyliterowy.get())

    if x == "alanina":
        if jednoliterowy != "A" and trzyliterowy == "Ala":
            label_result.config(text="Blad w symbolu jednoliterowym")
        if jednoliterowy == "A" and trzyliterowy != "Ala":
            label_result.config(text="Blad w symbolu trzyliterowym")
        if jednoliterowy != "A" and trzyliterowy != "Ala":
            label_result.config(text="Blad w symbolu jednoliterowym i trzyliterowym")
        if jednoliterowy == "A" and trzyliterowy == "Ala":
            tkinter.messagebox.showinfo('Brawo!', 'XD')

    if x == "tyrozyna":
        if jednoliterowy == "Y" and trzyliterowy == "Tyr":
            tkinter.messagebox.showinfo('Brawo!', 'XD')


def koniec():
    sys.exit()

root = tk.Tk()
root.geometry('400x200+100+200')
root.title('Program do zapamietywania aminokwasow')

jednoliterowy = tk.StringVar()
trzyliterowy = tk.StringVar()

label = tk.Label(root, text="Wygenerowany aminokwas to: ").grid(row=1, column=0)
label = tk.Label(root, text=x).grid(row=1, column=1)
label = tk.Label(root, text="Podaj symbol jednoliterowy:").grid(row=2, column=0)
label = tk.Label(root, text="Podaj symbol trzyliterowy:").grid(row=3, column=0)
labelResult = tk.Label(root)
labelResult.grid(row=5, column=1)

tk.Entry(root, textvariable=jednoliterowy).grid(row=2, column=1)
tk.Entry(root, textvariable=trzyliterowy).grid(row=3, column=1)

call_result = partial(call_result, labelResult, jednoliterowy, trzyliterowy)

button = tk.Button(root, text="Sprawdz", command=call_result).grid(row=4, column=1)
button = tk.Button(root, text="Losuj ponownie", command=x).grid(row=4, column=0)
button = tk.Button(root, text="Konczymy na dzis! :)", command=koniec).grid(row=5, column=0)

root.mainloop()
1

Stwórz funkcję która będzie losować aminokwas czy co to tam ma być i przypisuj to do x (na przyszłość wybierz lepszą nazwę zmiennej)

Czyli mógłbyś mieć coś tak prostego jak:

def get_random_amino_acid():
    x = random.choice(["alanina", "tyrozyna"])

Tyle że według mnie lepiej byłoby wziąć listę i zdefiniować jako stałą czyli:

# Tutaj jest lista aminokwasów, jako że nie będzie zmieniana piszemy nazwę używając tylko dużych liter
AMINO_ACIDS = [ 
    "alanina",
    "tyrozyna"
]

def get_random_amino_acid():
    amino_acid = random.choice(AMINO_ACIDS) # Zakładając że x zostało przezwane na amino_acid

Następnie, aby to się wykonywało musisz użyć callbacka. Czyli przycisk do losowania powinien wyglądać tak:

tk.Button(root, text="Losuj ponownie", command=get_random_amino_acid).grid(row=4, column=0)
# Zwróć uwagę na command= i na to że NIE dajemy ()

I tu robi się tylko gorzej - w sensie porobiłeś trochę błędów ale luz, da się to naprawić.
Przede wszystkim - kiedy wygenerujemy nowy tekst (kwas) to zmieniamy zmienną ale nie tekst w etykiecie (label). Aby tego dokonać musimy przekonfigurować ją. Najpierw jednak trzeba posprzątać ten kod bo wszystkie etykiety mają tą samą nazwę, a dokładniej zmienna zostaje ta sama dla każdych etykiet. A my chcemy: varA - labelA, varB - labelB itd. Czyli:

generated_label = tk.Label(root, text="Wygenerowany aminokwas to: ").grid(row=1, column=0)

# Tutaj trzeba rozbić na 2 linie bo potrzebujemy mieć obiekt w zmiennej a nie wartość zwracaną przez grid()
amino_acid_label = tk.Label(root, text=x)
amino_acid_label.grid(row=1, column=1)

one_letter_label = tk.Label(root, text="Podaj symbol jednoliterowy:").grid(row=2, column=0)
three_letter_label = tk.Label(root, text="Podaj symbol trzyliterowy:").grid(row=3, column=0)

Gdy już mamy posprzątane to możemy zmieniać wartość dla poszczególnych etykiet, więc wracamy do funkcji która losuje aminokwas i dodajemy

amino_acid_label.config(text=x)

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