我在寫一個小應用程序來複制一些文件。我做了幾乎所有我想要的東西,但有三件事:tkinter不能正常工作的進度條
1)在複製選項處於運動狀態時移動的進度條。我可以顯示它,但它不會反應。
我使用它來顯示它:
self.p = ttk.Progressbar(self, orient=HORIZONTAL, length=300, mode='indeterminate')
self.p.grid(row=5)
,然後啓動它在另一個DEF這是在擠壓按鈕的按下叫:
self.p.start()
shutil.copytree(self.source_direcotry0, self.cam0)
shutil.copytree(self.source_direcotry1, self.cam1)
shutil.copytree(self.source_direcotry2, self.cam2)
self.p.stop()
不幸發生複製,但酒吧根本不動。
2)第二個問題是連接到我的應用程序窗口的底部顯示的信息欄:
self.status = Label(self.master, text="Waiting for process to start...", bd=1, relief=SUNKEN, anchor=W)
self.status.pack(side=BOTTOM, fill=X)
,然後在相同的複製DEF被稱爲在它開始的時候我有這個:
self.status['text'] = "Files are being copyied, have patience ;)".format(self.status)
且狀態沒有改變這是奇怪的是在這個高清結束時,我也有同樣的命令來改變現狀,這一件作品:
self.status['text'] = "Files have been copyied".format(self.status)
3)我似乎無法附上一張照片我已經檢查過各種不同的選項,但它們都不起作用,這裏介紹的一個看起來像試圖顯示某些東西(窗口變大),但圖片不可見:
self.img = ImageTk.PhotoImage(Image.open("az.png"))
self.panel = Label(self, image=self.img, bg="#E6E6E6")
self.display = self.img
self.panel.grid(row=8)
我有點不確定它爲什麼發生這樣的,以防萬一,也爲更多的信息,我在這裏張貼的完整代碼:
from tkinter import *
from tkinter import ttk
import re
from tkinter import messagebox
from tkinter import filedialog
import ntpath
import os
import shutil
import tkinter.filedialog as fdialog
from send2trash import send2trash
from PIL import Image, ImageTk
#os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''')
# Here, we are creating our class, Window, and inheriting from the Frame
# class. Frame is a class from the tkinter module. (see Lib/tkinter/__init__)
class Window(Frame):
# Define settings upon initialization. Here you can specify
def __init__(self, master=None):
# parameters that you want to send through the Frame class.
Frame.__init__(self, master, bg="#E6E6E6")
#reference to the master widget, which is the tk window
self.master = master
#with that, we want to then run init_window, which doesn't yet exist
self.init_window()
def copyy(self):
self.status['text'] = "Files are being copyied, have patience ;)".format(self.status)
self.source_direcotry0= '/Volumes/CAM0/DCIM/100HDDVR'
self.source_direcotry1= '/Volumes/CAM1/DCIM/100HDDVR'
self.source_direcotry2= '/Volumes/CAM2/DCIM/100HDDVR'
self.source_direcotry3= '/Volumes/CAM3/DCIM/100HDDVR'
self.source_direcotry4= '/Volumes/CAM4/DCIM/100HDDVR'
self.source_direcotry5= '/Volumes/CAM5/DCIM/100HDDVR'
self.source_direcotry6= '/Volumes/CAM6/DCIM/100HDDVR'
self.source_direcotry7= '/Volumes/CAM7/DCIM/100HDDVR'
self.source_direcotry8= '/Volumes/CAM8/DCIM/100HDDVR'
self.source_direcotry9= '/Volumes/CAM9/DCIM/100HDDVR'
self.source_direcotry10= '/Volumes/CAM10/DCIM/100HDDVR'
self.source_direcotry11= '/Volumes/CAM11/DCIM/100HDDVR'
self.path0="recording/CAM0"
self.path1="recording/CAM1"
self.path2="recording/CAM2"
self.path3="recording/CAM3"
self.path4="recording/CAM4"
self.path5="recording/CAM5"
self.path6="recording/CAM6"
self.path7="recording/CAM7"
self.path8="recording/CAM8"
self.path9="recording/CAM9"
self.path10="recording/CAM10"
self.path11="recording/CAM11"
self.cam0=os.path.join(self.Destination.get(), self.path0)
self.cam1=os.path.join(self.Destination.get(), self.path1)
self.cam2=os.path.join(self.Destination.get(), self.path2)
self.cam3=os.path.join(self.Destination.get(), self.path3)
self.cam4=os.path.join(self.Destination.get(), self.path4)
self.cam5=os.path.join(self.Destination.get(), self.path5)
self.cam6=os.path.join(self.Destination.get(), self.path6)
self.cam7=os.path.join(self.Destination.get(), self.path7)
self.cam8=os.path.join(self.Destination.get(), self.path8)
self.cam9=os.path.join(self.Destination.get(), self.path9)
self.cam10=os.path.join(self.Destination.get(), self.path10)
self.cam11=os.path.join(self.Destination.get(), self.path11)
self.p.start()
shutil.copytree(self.source_direcotry0, self.cam0)
shutil.copytree(self.source_direcotry1, self.cam1)
shutil.copytree(self.source_direcotry2, self.cam2)
# shutil.copytree(self.source_direcotry3, self.cam3)
# shutil.copytree(self.source_direcotry4, self.cam4)
# shutil.copytree(self.source_direcotry5, self.cam5)
# shutil.copytree(self.source_direcotry6, self.cam6)
# shutil.copytree(self.source_direcotry7, self.cam7)
# shutil.copytree(self.source_direcotry8, self.cam8)
# shutil.copytree(self.source_direcotry9, self.cam9)
# shutil.copytree(self.source_direcotry10, self.cam10)
# shutil.copytree(self.source_direcotry11, self.cam11)
self.p.stop()
self.status['text'] = "Files have been copyied".format(self.status)
def deletee(self):
send2trash('/Volumes/CAM0/DCIM')
send2trash('/Volumes/CAM1/DCIM')
send2trash('/Volumes/CAM2/DCIM')
# send2trash('/Volumes/CAM3/DCIM')
# send2trash('/Volumes/CAM4/DCIM')
# send2trash('/Volumes/CAM5/DCIM')
# send2trash('/Volumes/CAM6/DCIM')
# send2trash('/Volumes/CAM7/DCIM')
# send2trash('/Volumes/CAM8/DCIM')
# send2trash('/Volumes/CAM9/DCIM')
# send2trash('/Volumes/CAM10/DCIM')
# send2trash('/Volumes/CAM11/DCIM')
self.status['text'] = "Files have been moved to trash".format(self.status)
def client_exit(self):
exit()
def about_popup(self):
messagebox.showinfo("About", "This is software used to copy or delete files in bulk from the Absolute Zero VR camera")
#Creation of init_window
def init_window(self):
self.Source=StringVar()
self.Destination=StringVar()
# changing the title of our master widget
self.master.title("AZ Data Extractor")
# allowing the widget to take the full space of the root window
self.pack(fill=BOTH, expand=1)
#Creating the menu
self.menubar = Menu(self.master)
#Creating submenues
self.filemenu = Menu(self.menubar, tearoff=0)
self.filemenu.add_command(label="Exit", command=root.quit)
self.menubar.add_cascade(label="File", menu=self.filemenu)
self.helpmenu = Menu(self.menubar, tearoff=0)
self.helpmenu.add_command(label="About", command=self.about_popup)
self.menubar.add_cascade(label="Help", menu=self.helpmenu)
#Displaying the menu
root.config(menu=self.menubar)
#Creating the intro label
l_instruction = Label(self, justify=CENTER, compound=TOP, text="Choose the destination for the copied files \n and press 'Go!' to start copyting", bg="#E6E6E6")
l_instruction.grid(columnspan=2, ipady=10)
l_instruction = Label(self, justify=CENTER, compound=TOP, text="Press 'Delete' to move all files \n from the camera to the trash", bg="#E6E6E6")
l_instruction.grid(row=6, columnspan=2, ipady=10)
# ttk.Style().configure('green/black.TButton', foreground='green', background='black')
#Creating the button
MyDestination=Entry(self, textvariable=self.Destination, bg="#E6E6E6")
MyDestination.grid(row=2, columnspan=2, ipady=10)
uploadButton = Button(self, text="Choose destination folder",command=lambda:self.Destination.set(fdialog.askdirectory()))
uploadButton.grid(row=3, columnspan=2, ipady=10)
goButton = Button(self, text="Go!",command=self.copyy)
goButton.grid(row=4, columnspan=2, ipady=10)
delButton = Button(self, text="Delete",command=self.deletee)
delButton.grid(row=7, columnspan=2, ipady=10)
self.p = ttk.Progressbar(self, orient=HORIZONTAL, length=300, mode='indeterminate')
self.p.grid(row=5)
self.img = ImageTk.PhotoImage(Image.open("az.png"))
self.panel = Label(self, image=self.img, bg="#E6E6E6")
self.display = self.img
self.panel.grid(row=8)
#resizing configuration
self.grid_columnconfigure(0,weight=1)
self.grid_columnconfigure(1,weight=1)
self.grid_rowconfigure(0,weight=1)
self.grid_rowconfigure(1,weight=1)
self.grid_rowconfigure(2,weight=1)
self.grid_rowconfigure(3,weight=1)
self.grid_rowconfigure(4,weight=1)
self.grid_rowconfigure(5,weight=1)
self.grid_rowconfigure(6,weight=1)
self.grid_rowconfigure(7,weight=1)
self.grid_rowconfigure(8,weight=1)
self.grid_rowconfigure(9,weight=1)
self.grid_rowconfigure(10,weight=1)
#status Bar
self.status = Label(self.master, text="Waiting for process to start...", bd=1, relief=SUNKEN, anchor=W)
self.status.pack(side=BOTTOM, fill=X)
# root window created. Here, that would be the only window, but you can later have windows within windows.
root = Tk()
root.resizable(width=False,height=False);
# root.configure(background='black');
# fm = Frame(root, width=300, height=200, bg="blue")
# fm.pack(side=TOP, expand=NO, fill=NONE)
#root.geometry("230x340")
#creation of an instance
app = Window(root)
#mainloop
root.mainloop()
編輯: 剛因爲在此期間出現的另一個問題我似乎無法改變按鈕的底色和輸入字段周圍的框架。我讀到它可能是因爲使用MacOS平臺,可以嗎?任何解決方法?
EDIT2:我已經找到一種方法,使圖片的工作和按鈕的背景與: 圖片: 渲染=光象(文件=「az.gif」 ) IMG =標籤(個體,圖像渲染=,BG = 「#E6E6E6」) img.image =渲染 img.grid(行= 8) 和按鈕加入 「highlightbackground」: goButton =按鈕( self,text =「Go!」,command = self.copyy,highli ghtbackground =「#E6E6E6」) 但我仍然無法弄清楚這個進度條,根本沒有提示? – Bart
您應該在調用'self.p.start()'後嘗試在新線程上啓動複製功能。複製可能會阻止UI線程爲進度條設置動畫。 – Joules
我嘗試過使用線程,但是我無法使它工作,甚至在我使用線程時文件不會被複制。可能我錯誤地實現了它,但我找不到如何正確執行它的方法。 'self.p.start() root.update_idletasks() 對於x在範圍(12): 噸= threading.Thread(目標= self.copyy2) t.deamon =真 t.start() self.p.stop()' 然後所有的'shutil.copytree(self.source_direcotry0,self.cam0)'都被移動到新的名爲'copyy2'的def中。 – Bart