2016-09-02 72 views
1
from tkinter import * 
import time 

class MyClass(object): 
    def __init__(self): 
     root = Tk() 

     button = Button(root, text="Button", command=self.command).pack() 

     #scrollbar and textbox 
     scrollbar = Scrollbar(root) 
     scrollbar.pack(side=RIGHT, fill=Y) 

     self.tbox = Text(root, wrap=WORD, yscrollcommand=scrollbar.set) 
     self.tbox.pack(fill=X) 
     scrollbar.configure(command=self.tbox.yview) 

     root.mainloop() 
    def command(self): 
     time.sleep(2) 
     self.tbox.insert(END, "Some text1\n") 

     time.sleep(2) 
     self.tbox.insert(END, "Some text2\n") 

     time.sleep(2) 
     self.tbox.insert(END, "Some text3") 
MyClass() 

是否有可能一个接一个地显示这些文本而不是全部同时显示?我把time.sleep()证明它没有单独出现Python Tkinter文本框插入问题

编辑:这是我的代码。所以问题是,如果我使用self.tbox.insert(END, "text")而不是print("text"),那么文本不会以相同的方式出现,如果我使用print,它当然会立即出现(打印)。我做了一个网站爬虫或类似的东西,所以当文本出现在文本框中时,等待是非常令人沮丧的。是的,我不想在这种情况下使用打印

from selenium.common.exceptions import NoSuchElementException 
from selenium import webdriver 
from tkinter import * 

phantom_path = r'phantomjs.exe' 
driver = webdriver.PhantomJS(phantom_path) 

class Crawler(object): 
    def __init__(self): 

     self.root = Tk() 
     self.root.title('Website Crawler') 
     label1 = Label(self.root, text='Select a website').pack() 

     self.website = StringVar() 
     Entry(self.root, textvariable=self.website).pack() 

     #button which executes the function 
     button = Button(self.root, text='Crawl', command=self.command) 
     button.pack() 

     #scrollbar and textbox 
     self.scrollbar = Scrollbar(self.root) 
     self.scrollbar.pack(side=RIGHT, fill=Y) 

     self.tbox = Text(self.root, wrap=WORD, yscrollcommand=self.scrollbar.set) 
     self.tbox.pack(fill=X) 
     self.scrollbar.configure(command=self.tbox.yview) 

     self.root.mainloop() 

    def command(self): 

     url = self.website.get() 
     link_list = [] 
     link_list2 = [] 

     driver.get(url) 

     driver.implicitly_wait(5) 

     self.tbox.insert(END, "Crawling links..\n") 

     #finds all links on the site and appens them to list 
     try: 
      links = driver.find_elements_by_tag_name('a') 
      for x in links: 
       x = x.get_attribute('href') 
       link_list.append(x) 
       self.tbox.insert(END, str(x)+'\n') 

     except NoSuchElementException: 
      self.tbox.insert(END, 'This site have no links\n') 
      pass 
     try: 
      for sites in link_list: 
       driver.get(sites) 
       self.tbox.insert(END, "### In "+str(sites)+': ###\n') 
       links = driver.find_elements_by_tag_name('a') 
       for y in links: 
        y = y.get_attribute('href') 
        link_list.append(y) 
        self.tbox.insert(END, str(y)+'\n') 
     except NoSuchElementException: 
      self.tbox.insert(END, 'This site have no links\n') 
      pass 
     self.tbox.insert(END, 'Done\n\n') 

Crawler() 
+0

您可以逐个插入它们。你在问如何让他们一个接一个地出现? –

+0

@Bryan Oakley是的,我的意思是,我解决了这个问题。 –

回答

1

time.sleep()是一个阻塞调用。使用after

from tkinter import * 
import time 

class MyClass(object): 
    def __init__(self): 
     self.root = Tk() 

     button = Button(self.root, text="Button", command=self.command).pack() 

     #scrollbar and textbox 
     scrollbar = Scrollbar(self.root) 
     scrollbar.pack(side=RIGHT, fill=Y) 

     self.tbox = Text(self.root, wrap=WORD, yscrollcommand=scrollbar.set) 
     self.tbox.pack(fill=X) 
     scrollbar.configure(command=self.tbox.yview) 

     self.root.mainloop() 
    def command(self): 
     self.root.after(1000, lambda: self.tbox.insert(END, "Some text1\n")) 

     self.root.after(2000, lambda: self.tbox.insert(END, "Some text2\n")) 

     self.root.after(3000, lambda: self.tbox.insert(END, "Some text3")) 
MyClass() 

演示:

enter image description here

+0

实际上,我不想在给定时间插入这些文本,我只是把'time.sleep()'反映出代码需要大约那段时间来执行代码。我希望这些文字在出现问题时出现。就像 'if x == y: self.tbox.insert(END,“Some text”)#this is right right now# 问题是程序首先执行命令,然后出现这些文本框。我希望这些文本以精确时刻出现 –

+0

@fedoraman分享您的代码样本。我无法理解'这会出现在这一刻',然后'那些文字出现在方框中' –

+0

@ Nehal J Wani我编辑了我的文章并做了更好的解释 –

0

如果你想使用time.sleep(),你将需要使用Threading模块来显示文本逐一。

from tkinter import * 
import time 
import threading 

class Threader(threading.Thread): 

    def __init__(self, tbox, *args, **kwargs): 

     threading.Thread.__init__(self, *args, **kwargs) 
     self.tbox = tbox 
     self.daemon = True # Stop threads when your program exits. 
     self.start() 

    def run(self): 
     time.sleep(2) 
     self.tbox.insert(END, "Some text1\n") 

     time.sleep(2) 
     self.tbox.insert(END, "Some text2\n") 

     time.sleep(2) 
     self.tbox.insert(END, "Some text3") 

      break 

class MyClass(object): 
     def __init__(self): 
      self.root = Tk() 

      button = Button(self.root, text="Button", command= lambda: Threader(tbox=self.tbox)).pack() 

      #scrollbar and textbox 
      scrollbar = Scrollbar(self.root) 
      scrollbar.pack(side=RIGHT, fill=Y) 

      self.tbox = Text(self.root, wrap=WORD, yscrollcommand=scrollbar.set) 
      self.tbox.pack(fill=X) 
      scrollbar.configure(command=self.tbox.yview) 

      self.root.mainloop() 
MyClass()