Wpis z mikrobloga

#python #naukaprogramowania

potrzebuję pomocy w swoim programie. Dopiero się uczę ale w moim programie dzieje się coś czego nie do końca rozumiem. Problem dotyczy GUI.

1. Program (na razie) ma wygenerować nieprzerwaną ścieżkę liczb od górnego lewego rogu do dolnego prawego.
2. Są 3 funkcje. Pierwsza przy pomocy randint wyznacza koordynaty składające się z dwóch liczb. Przykładowy wynik to:
[[0, 0], [1, 0], [1, 1], [1, 2], [1, 3], [2, 3], [3, 3], [4, 3], [4, 4], [5, 4], [5, 5], [6, 5], [7, 5], [8, 5], [8, 6], [9, 6], [9, 7], [10, 7], [10, 8], [10, 9], [10, 10]]

druga wyznacza ciąg liczb na podstawie wylosowanych liczb (też randint). Na przykład losuje liczbę wejściową od 0 do 9 a potem drugą od 0 do 9 i generuje np. pierwsza liczba 5 a druga to 1 i wypluwa ciąg 5,6,7,8,9.....

4. W gui generuję siatkę 100 przycisków oto fragment kodu:

def create_widget(self):
for x in range(10):
for y in range(10):
self.bttn = Button(self)
for c in range(len(numbers)):
if x == path[c][0] and y == path[c][1]:
self.bttn["text"] = numbers[c]
self.bttn["bg"] = "blue"
else:
self.bttn["text"] = randint(0,200)
self.bttn.grid(row=x, column=y)

tyle że po pierwsze przyciski z mojego ciągu nie zgadzają się z tym co wywala program (tło celowo dałem na niebiesko dla sprawdzenia, docelowo nie będzie) a po drugie ciąg nie kończy się zawsze w dolnym prawym rogu (czyli 10,10). Czego nie widzę? Załączam screen.

edit 1. Ok zmieniłem przy pętli 10 na 11 i grają koordynaty ale z liczbami dalej rozkminiam
IsambardKingdomBrunel - #python #naukaprogramowania

potrzebuję pomocy w swoim prog...

źródło: comment_f3EP5xm5GR7MDSRFcufyR9A27ACdXXmo.jpg

Pobierz
  • 36
  • Odpowiedz
@IsambardKingdomBrunel: nie wiem dokładnie co chcesz zrobić, ale jeżeli to o czym myśle, to wystarczy ci jeden for.
https://pastebin.com/mcwUMbW0

w dobieraniu wysokości kolejnych lini i odstępów w kolumnach musisz wziąć pod uwage wysokość buttona, której tam nie wziąłem pod uwage, więc sobie pododawaj.

cokolwiek chcesz tam jeszcze dodać, to zrobisz to w taki sposób, a tyle forów co masz wyżej to zło. jak będziesz miał to przetestować, to ci się odechce.
  • Odpowiedz
@IsambardKingdomBrunel: napisałeś to w pierwszym zdaniu, a ja nie pytam złośliwie.

najprościej rzecz biorąc self to instancja klasy której metodą jest **create_widget** - jeżeli chcesz utworzyć kilka przycisków możesz je trzymać np. na liście:

self.buttons = [Button(self) for x in range(10) for y in range(10)]
lub słowniku, jeśli wolisz mieć strukturę indeksowaną w sposób w jaki osadzasz przyciski na gridzie (bo łatwiej to sobie wyobrazić etc.)

self.buttons = {(x, y): Button(self)
  • Odpowiedz
to tak jeszcze dodam po co struktury z przyciskami - po pierwsze nie znam tkintera i chwilę mi zajęło ogarnięcie dlaczego to w ogóle działa, tj. czemu garbage collector nie zgarnia wszystkich instancji przycisków poza ostatnią, na którą masz w kodzie łatwo widoczną referencję (self.bttn po ostatniej iteracji). widocznie menedżer geometrii ramki, instancjowany/konfigurowany z poziomu instancji ramki, trzyma referencje na przyciski, po dodaniu ich do menedżera przez wywołanie metody .grid z poziomu
  • Odpowiedz
@IsambardKingdomBrunel: bo jeśli dobrze zrozumiałem co właśnie zrobiłeś, to aktualnie self.bttn to jest lista instancji przycisków. fakt, w przykładzie powyżej użyłem czegoś co może nie być Ci znane (list comprehension), ale jest to tylko sposób instancjonowania listy, wynikiem jest po prostu lista (tak samo jak słownik dla dict comprehension w drugiej części przykładu).

piszesz że kombinujesz sam, ale z tego co widzę to chyba nie tylko z GUIem, ale z pythonem
  • Odpowiedz