Problem z pętlą for

Problem z pętlą for
TO
  • Rejestracja:około 7 lat
  • Ostatnio:około 6 lat
  • Postów:13
0

Witam, mam problem z pętlą wykonuje się albo 2 razy albo o 1 raz za mało.
Rozwinę nieco działanie programu:

  1. Pobiera dane z links json i tworzy dla nich checkboxy.
  2. Po wybraniu checkboxow, zaznaczone dodaje do listy to_download
  3. Pobiera pliki z listy i odpakowuje

Chodzi o plik main.py (prawdopodobnie linie 157-271)
kodzik: https://github.com/Tomeczekqq/GarrysModContentAssistant

lion137
Wklej tu kod i Opisz problem, oraz co Robiłes, żeby go rozwiązać, jak na razie, wątek wygląda na kosz.
Visual Code
prawdopodobnie chodzi o linię.... :D haha
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10053
0

Zainteresuj się takim narzędziem jak debugger. Na pewno Ci pomoże.

TO
  • Rejestracja:około 7 lat
  • Ostatnio:około 6 lat
  • Postów:13
0
Kopiuj
 def init_download(self):
        '''
        Gets checkboxes state and adds it to query.
        Starts threading
        '''
        for choice in self.choices:
            if (choice.enabled.get()) and ((choice.tag in to_download) == False):
                to_download.append(choice)
            elif (choice.enabled.get() == False) and (choice.tag in to_download):
                to_download.remove(choice)
        self.thread = threading.Thread(target=self.queue)
        self.thread.daemon = True
        self.thread.start()

    def queue(self):
        '''
        -Setups ui disable checkboxes and place downloading widgets
        -Starts downloading from queue
        '''
        self.label_status['text'] = "Preparing queue"
        if to_download == []:
            self.label_path["text"] = "You need to select item to download"
            return False
        self.button_start.destroy()
        self.label_path.destroy()
        self.progressbar.place(x=30, y=525, width=740, height=10)
        self.label_eta.place(x=26, y=540)
        self.label_speed.place(x=690, y=540, width=100)
        self.label_status.place(x=30, y=500, width=740, height=20)
        self.label_status["text"] = "Preparing queue... | {0} items in queue)".format(
            len(to_download)
        )
        self.disable_checkboxes()
        for con in to_download:
            self.start_download(con)

    def start_download(self, content):
        '''
        Starts downloading and update widgets (eta, speed and status)
        '''
        if "mediafire" in content.url:
            content.url = tools.scrap_mediafire(content.url)
        downloader = SmartDL(content.url, gmod_dir, progress_bar=False)
        try:
            downloader.start(blocking=False)
        except:
            self.label_status["text"] = "Cant reach {}".format(content.name)

        self.button_action.place(x=380, y=545)

        while not downloader.isFinished():
            if is_close:
                break
            self.label_speed["text"] = downloader.get_speed(human=True)
            self.label_eta["text"] = downloader.get_eta(human=True)
            self.progressbar["value"] = downloader.get_progress()*100
            self.label_status["text"] = ("{} {} ({}/{}) | {} files in queue").format(
                downloader.get_status(),
                content.name,
                downloader.get_dl_size(human=True),
                tools.size_format(downloader.filesize),
                str(len(to_download))
            )
            sleep(0.2)

        if is_close:
            return True

        if downloader.isSuccessful():
            self.label_status["text"] = "Downloading {} completed".format(
                content.name)
            to_download.remove(content)
            self.label_status["text"] = "Unziping..."
            is_unzipped = tools.unzip(content.url, gmod_dir)
            if is_unzipped[0]:
                self.label_status["text"] = "Completed {}".format(content.name)
            else:
                self.label_status["text"] = "Unziping {} FAILED! You have to unzip it manualy.".format(
                    is_unzipped[1]
                )
            if to_download == []:
                self.button_action["text"] = "Exit"

            print(to_download)
            return True
        else:
            self.label_status["text"] = "Downloading {} FAILED!".format(
                content.name)
            return False
lion137
Dzięki, kolejna porcja kodu, co dalej?
Pyxis
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 godzin
0

Nie da się Tobie pomóc w tym momencie. Jedyna rada to rozbicie problemu na mniejsze elementy i wskazanie nam, co nie działa tak, jakbyś chciał, by działało.

TO
  • Rejestracja:około 7 lat
  • Ostatnio:około 6 lat
  • Postów:13
0

No wlasnie tyle wiem ze cos prawdobnie z petla nie gra.
Jak wybieram jeden element do pobrania to wszystko dziala, gdy wybieram 2 pobiera tylko 1, gdy wybieram 3 pobiera tylko 2.
No i dajmy ze pobieram 2 elementy, to po pobraniu 1, petla po prostu sie przerywa.

Pyxis
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 godzin
0

Która konkretnie? W Twoim przytoczonym kodzie są dwie pętle for.

TO
  • Rejestracja:około 7 lat
  • Ostatnio:około 6 lat
  • Postów:13
0

@Pyxis:

Kopiuj
self.downloaded = []
for con in to_download:
    self.downloaded.append(self.start_download(con))
if to_download == []:
    self.button_action["text"] = "Exit"
edytowany 2x, ostatnio: Tomeczekqq
Pyxis
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 godzin
1

Powodem jest to, że iterujesz po "zmiennym" obiekcie (mam na myśli mutable object), jakim jest lista i jednocześnie wykonujesz na nim operację usuwania zawartości. Robisz mniej więcej coś takiego:

Kopiuj
def rm_list_element(item):
    L.remove(item)

N = 2
L = [i for i in range(N)] # [0, 1]

for l in L:
    rm_list_element(l)

Po tej operacji L = [1], czyli usunęło Ci tylko jeden element. Gdy zainicjujesz N = 3, otrzymasz również L[1], czyli tym razem usunęło Ci tylko dwa elementy.

W Twoim kodzie odpowiednikiem listy L jest to_download. Odpowiednikiem funkcji rm_list_element jest metoda start_downaload (linia 193), a samo usuwanie elementów z listy występuje w linii 228. Pętlę po której iterujesz, już znalazłeś ;)

TO
Dzięki, już ogarniam :D
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)