2015-02-08 191 views
3

我不知道我是否使用正確的代碼來做到這一點。我寫了一個小腳本來查找文件夾中的硬盤:Tkinter GUI凍結

import sys 
from tkinter import * 
from tkinter import ttk 
import threading 
import os 
mGui = Tk() 
mGui.geometry('450x80') 
mGui.title('Copy folder') 
progressbar = ttk.Progressbar(orient=HORIZONTAL, length=200, mode='determinate') 
progressbar.pack(side="bottom") 

xe = 'progresscache' 
def handle_click(): 
    progressbar.start() 
    def searcher(): 
     for root, dirs, files in os.walk(r'c:'): 
      for name in dirs: 
       if name == xe: 
        print ("find !") 
        progressbar.stop()   
    t = threading.Thread(target=searcher) 
    t.start() 

dirBut = Button(mGui, text='Go find !', command = handle_click) 
dirBut.pack() 
mGui.mainloop() 

經過多次嘗試,我還是不得不凍結GUI,當我點擊我的boutton。
所以我決定用線程調用這個動作。
我不知道我們是否應該這樣做,這樣既避免凍...

好了,一切似乎沒有凍結工作..

現在,我想做一類我的代碼, 但每次我得到線程 這裏的錯誤是我的代碼:


我班Searcher.py(在Appsave文件夾)

import os 
import threading 
class Searcher: 

    def recherche(zeFolder): 
     for root, dirs, files in os.walk(r'c:'): 
      for name in dirs: 
       if name == zeFolder: 
        print ("Finded !") 
        progressbar.stop() 
    threading.Thread(target=recherche).start() 

我主要的.py

# -*- coding: utf-8 -*- 
import sys 
from tkinter import * 
from tkinter import ttk 
import threading 
import os 
from Appsave.Searcher import Searcher 

mGui = Tk() 
mGui.geometry('450x80') 
mGui.title('Djex save') 
progressbar = ttk.Progressbar(orient=HORIZONTAL, length=200, mode='determinate') 
progressbar.pack(side="bottom") 

xe = 'progresscache' 
la = Searcher 
def handle_click(): 
    progressbar.start() 
    la.recherche(xe) 
dirBut = Button(mGui, text='Go find !', command = handle_click) 
dirBut.pack() 
mGui.mainloop() 

這裏是輸出誤差

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "C:\python34\lib\threading.py", line 921, in _bootstrap_inner 
    self.run() 
    File "C:\python34\lib\threading.py", line 869, in run 
    self._target(*self._args, **self._kwargs) 
TypeError: recherche() missing 1 required positional argument: 'zeFolder' 

我希望能有足夠的細節,我的問題尋求幫助,謝謝

回答

4

你應該嘗試的子類Thread,如下所示:

class Searcher(threading.Thread): 

    def __init__(self, zeFolder, progressbar): 
     super(Searcher, self).__init__() 
     self.zeFolder = zeFolder 
     self.progressbar = progressbar 

    def run(self): 
     for root, dirs, files in os.walk(r'c:'): 
      for name in dirs: 
       if name == self.zeFolder: 
        print ("Finded !") 
        self.progressbar.stop() 

,然後調用它像這樣:

xe = 'progresscache' 
la = Searcher(xe, progressbar) 
def handle_click(): 
    progressbar.start() 
    la.start() 

相反的:

xe = 'progresscache' 
la = Searcher 
def handle_click(): 
    progressbar.start() 
    la.recherche(xe) 

希望它能幫助!

+0

你好,非常感謝你的支持者。當我建立項目,一切正常,但是當我點擊按鈕時,我有一個錯誤:文件「S:\ pypy \ snake \ Appsave \ Searcher.py」,第14行,運行 如果名稱== zeFolder: NameError:名字'zeFolder'沒有定義 – jmercier 2015-02-08 18:44:16

+1

@jmercier糟糕!在'zeFolder'之前,我忘了把'self.'。檢查更新的代碼! – cdonts 2015-02-08 19:01:24

+0

你是我的英雄!工作正常 !現在我必須瞭解你的代碼,不要愚蠢地複製粘貼,ty最好的問候 – jmercier 2015-02-08 19:04:58