2016-04-05 14 views
1

Gönder düğmesine sahip olduğum bir kırpma uygulaması yaptım, bu düğmeye bastığımda request isteği (ctl) metoduna bir tarama isteği giriyor ve tarama ile başlıyor. kireç bana cevap verene kadar inaktif hale gelir. ama ben arka planda devam eden bir süreç durur ve bir dahaki sefere irade düğmesine basarak işlemi yeniden başlatmak için düğmesine basabilirsiniz tkinter uygulamasında başka bir düğme "dur" istiyorum. Ben tkinter kullanılabilir yöntemleri yok denedim ve bıraktınız ama onlar kırpılmış widget kapanır. benim kodudur: -, herhangi bir şekilde sepearte dosyasında mevcut olduğu ve halen i threads.So kullanmıyorum, bağlantılarını taramakta fonksiyon request.get sahippython içindeki request.get komutunu nasıl durduracağım

#!/usr/bin/python 
# -*- coding: latin-1 -*- 
from Tkinter import * 
import thread 
from tool_crawler import * 
import tkMessageBox 
import ttk 

# function which accepts url from GUI and pass it further for the 
def crawl(url): 
    time_delay = time_delay_box.get() 

    if url == "Please enter URL.......": 
     tkMessageBox.showerror("Error(错误)", "Please enter a valid URL(请输入有效网址)") 

    elif not url: 
     tkMessageBox.showerror("Error(错误)", "Please enter a valid URL(请输入有效网址)") 


    else: 
     tree.heading("#0", text=url) 
     links = find_links(url, time_delay) 
     #print links 
     for i, link in enumerate(links): 
      tree.insert("", i, str(i), text=link) 
      tree.bind("<Double-1>", OnDoubleClick) 

# function will invoke when any node in tree is double clicked  
def OnDoubleClick(event): 
     item = tree.identify('item',event.x,event.y)   
     url = tree.item(item,"text") 
     index = tree.index(item) 
     parent = tree.parent(item) 
     crawl_child(url,index,parent) 


def crawl_child(url,index,parent): 
    links = find_links(url, time_delay) 
    #print links 
    for i, link in enumerate(links): 
     if not parent: 
      tree.insert(str(index), i, str(index)+"."+str(i), text=link) 
     else: 
      tree.insert(str(parent)+"."+str(index), i, str(parent)+"."+str(index)+"."+str(i), text=link) 

# tkinter object 
top = Tk() 
top.configure(background='Lavender') 

# window title 
top.title("Fan Wan Crawler ") 

# tkinter minimum and maximum size 
top.minsize(width=1460, height=800) 
top.maxsize(width=1460, height=800) 

# url entry area i.e. text box to enter the URLS 
url = Entry(top, bd =3, width = 180) 
url.insert(0, "Please enter URL.......") 
url.pack(side = TOP) 

# function to show and hide the text on entry and exit 
def default(event): 
    current = url.get() 
    if current == "Please enter URL.......": 
     url.delete ("0", END) 
    elif not current: 
     url.insert("0", "Please enter URL.......") 

# code to call function default on focusin and focusout 
url.bind("<FocusIn>", default) 
url.bind("<FocusOut>", default) 

# submit button which is performing action on submit 
submit = Button(top, text="Submit(提交)", width=15, bg='lightblue', command=lambda: crawl(url.get())) 
submit.pack(side = TOP) 

# time delay label 
time_label = Label(top, text="Time Dealy (时间延迟):", font= ("Helvetica", 12), bg="Lavender", fg = "green") 
time_label.place(x=2, y=27) 

# time delay Entry 
time_delay_box = Spinbox(top, from_=0, to=100, width=3) 
time_delay_box.place(x=175, y=27) 

# time description 
time_label = Label(top, text="(in sec.(以秒为单位))", font=("Helvetica", 12), bg="Lavender", fg = "green") 
time_label.place(x=220, y=27) 

# tree area 
tree = ttk.Treeview(top, selectmode="browse", height= "36") 
columns = tree.column("#0", minwidth=0, width=720, stretch=True) 

tree.place(x=2,y=56) 

top.mainloop() 

temelde ben arıyorum find_links işlevi yoktur iş parçacığı kullanmadan durdurmak için. Onu durdurmak istemiyorum sadece bu süreci öldürmek istiyorum.

cevap

1

Sen iplik yöntemlerine threading.Condition ve threading.Lock()

Örnek yoluyla olurken konuları "duraklatmayı kaldırmayı" "duraklatma" ve sağlayan bir duraklatma/düğmesi oluşturmak sonra başka bir iş parçacığı emekleme/kazıma başlatmak ve bir thread kullanabilirsiniz iş parçacığı ayarlamak için tek bir yol, gui oluşturmadı ya da herhangi bir şey sadece nasıl bir iş parçacığı seçmek için nasıl GUI içinde bir düğme tıklaması ile nasıl kullanılacağını gösteren bir örnek gösterdi. Bu, iş parçacığının geçerli request.get çağrısının işlenmesi bittikten sonra duraklatma ve sürdürme işleminin devam edeceğini varsayar. Bir görevin ölü ortasını durdurmaya çalışmak, kendisine tamamen farklı bir konudur.

cevap
import threading, requests 
import tkinter as tk 

def switch_thread_states(widget): 

    #or whatever pause/resume text you wish for the widget/button 
    if widget['text'] == 'Pause' 
     widget['text'] = 'Resume' 
    else: 
     widget['text'] = 'Pause' 
    for thread in threading.enumerate(): 
     if not isinstance(thread, threading._MainThread): 
      if thread.paused: 
       thread.resume() 
      else: 
       thread.pause() 

class PauseableThread(threading.Thread): 

    def __init__(self, urls): 

     threading.Thread.__init__(self) 
     self.urls = urls 
     self.paused = False 
     self.pause_cond = threading.Condition(threading.Lock()) 

    def run(self): 

     for url in self.urls: 

      with self.pause_cond: 
       while self.paused: 
        self.pause_cond.wait() 
      #make requests here or whatever you're doing 
      requests.get(url, headers={'User-Agent':'Mozilla/5.0 .....'}) 

    def pause(self): 

     self.paused = True 
     self.pause_cond.acquire() 

    def resume(self): 

     self.paused = False 
     self.pause_cond.notify() 
     self.pause_cond.release() 

    #make root 
    #make a button that calls switch_thread_states on press 
    #spawn threads with urls lists etc 
+0

teşekkür ama şu anda çalışan sürecini öldürmeye yüzden mümkündür, sadece bir tarama fonksiyonu bağlantılarını taramakta yöntemi request.get kullanarak diğer dosya thats mevcut find_links arıyorum şu anda konuları kullanmıyorum direkt olarak . ayrıca bununla birlikte, işlemcinin çalışmasına ve sadece birinin gerektiğinde tıklayabileceğinden aktif hale gelmesini durdurmak için tikleyicinin etkin olmamasını istiyorum. Kodu güncelledim. – ashish

+0

GUI'nin olay dizisinde çalışan bir işleminiz olamaz ve düğmelerin ayrı bir konu veya https://docs.python.org/2/library/subprocess.html adresinde olmadan etkin kalmasını sağlayın. Diğer işlevin çağrılması, GUI'nin iş parçacığı işlenene kadar engellenir, böylece durdurma düğmesini tıklayamazsınız. Kök, işlevinizi çağırmak için ana tk penceresi olan root.after gibi bir şeyi kullanmayı deneyebilirsiniz, ancak işlenirken yine de engellenir. – Pythonista

+0

oh kulağa hoş geliyor, ama tkinter işlemi durdurmak için doğrudan bir yöntem sunmuyor mu. request.get aramasını durdurmak istiyorum. – ashish

İlgili konular