Wie erstelle ich den Fortschrittsbalken in ttk?

Ich möchte einen Fortschrittsbalken beim Herunterladen einer Datei aus dem Web mit der Methode urllib.urlretrive .

Wie verwende ich die ttk.Progressbar ?

Hier ist was ich bisher gemacht habe

 from tkinter import ttk from tkinter import * root = Tk() pb = ttk.Progressbar(root, orient="horizontal", length=200, mode="determinate") pb.pack() pb.start() root.mainloop() 

Aber es hält einfach Schleifen.

4 Solutions collect form web for “Wie erstelle ich den Fortschrittsbalken in ttk?”

Für einen bestimmten Modus willst du nicht start . Stattdessen konfigurieren Sie einfach den value des Widgets oder rufen Sie die step .

Wenn du im voraus weißt, wie viele Bytes du herunterschickst (und ich nehme an, dass du da machst, da du einen bestimmten Modus benutzt hast), ist die einfachste Sache zu tun, die maxvalue Option auf die Nummer zu setzen, die du lesen wirst. Dann, jedes Mal, wenn Sie ein Chunk lesen Sie konfigurieren den value , um die Gesamtzahl der Bytes lesen. Der Fortschrittsbalken wird dann den Prozentsatz herausfinden.

Hier ist eine Simulation, um Ihnen eine grobe Vorstellung zu geben:

 import tkinter as tk from tkinter import ttk class SampleApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) self.button = ttk.Button(text="start", command=self.start) self.button.pack() self.progress = ttk.Progressbar(self, orient="horizontal", length=200, mode="determinate") self.progress.pack() self.bytes = 0 self.maxbytes = 0 def start(self): self.progress["value"] = 0 self.maxbytes = 50000 self.progress["maximum"] = 50000 self.read_bytes() def read_bytes(self): '''simulate reading 500 bytes; update progress bar''' self.bytes += 500 self.progress["value"] = self.bytes if self.bytes < self.maxbytes: # read more bytes after 100 ms self.after(100, self.read_bytes) app = SampleApp() app.mainloop() 

Für diese zu arbeiten, müssen Sie sicherstellen, dass Sie nicht blockieren die GUI-Thread. Das heißt, man liest in Klumpen (wie im Beispiel) oder das Lesen in einem separaten Thread. Wenn Sie Threads verwenden, können Sie die progressbar-Methoden nicht direkt anrufen, da tkinter Single Thread ist.

Sie könnten das progressbar Beispiel auf tkdocs.com finden , um nützlich zu sein.

Wenn du nur einen Fortschrittsbalken willst, um zu zeigen, dass das Programm beschäftigt ist / arbeiten, ändere einfach den Modus von bestimmter bis unbestimmter

 pb = ttk.Progressbar(root,orient ="horizontal",length = 200, mode ="indeterminate") 

Ich habe den Code für Sie vereinfacht.

 import sys import ttk from Tkinter import * mGui = Tk() mGui.geometry('450x450') mGui.title('Hanix Downloader') mpb = ttk.Progressbar(mGui,orient ="horizontal",length = 200, mode ="determinate") mpb.pack() mpb["maximum"] = 100 mpb["value"] = 50 mGui.mainloop() 

Ersetzen Sie 50 mit dem Prozentsatz des Downloads.

Ich möchte auf etwas hinweisen, das aus der Simulation nicht ersichtlich ist. Bei einigen Betriebssystemen wird os.stat () 0 zurückgeben, wenn eine leere Datei zum Schreiben geöffnet wurde, bis das Dateizugriff geschlossen ist. Dies wird die Fähigkeit des Fortschrittsbalken, der die fortschreitende Größe einer heruntergeladenen Datei zeigt, besiegen.

  • Wie bekomme ich Tabs eines ttk Notebooks in verschiedenen Reihen?
  • So erstellen Sie eine Baumansicht mit Kontrollkästchen in Python
  • Tkinter-Befehl ignoriert einige Zeilen
  • Python Tkinter Eintrag zeigt den aktuellen Wert von textvariable nicht an
  • Ttk.Button gibt keine zurück
  • Python: Wie bekomme ich progressbar start () info von einem fenster (klasse) zu anderen
  • Tkinter: ProgressBar mit unbestimmter Dauer
  • Erstellen Sie resizable / multiline Tkinter / ttk Etiketten mit Word Wrap
  • Gibt es eine Möglichkeit, Tabs eines Notebooks untereinander zu setzen?
  • Warum ttk Progressbar erscheint nach dem Prozess in Tkinter
  • Wie mache ich einen Screenshot von einer tkinter Anwendung?
  • Python ist die beste Programmiersprache der Welt.