自动刷新文本wiget-tkinter

嗨;我创建了一个基于存储在txt文件中的数据介绍的应用程序。这些文件的内容显示在文本微件中
我的问题是我无法自动刷新文本小工具的显示
Python3.6中的代码,它被分成几个部分:

选择 | 换行 | 行号
  1.  
  2. from tkinter import *
  3. from tkinter.ttk import Notebook
  4. import tkinter.ttk as ttk
  5. import time
  6. #window
  7. root=Tk()
  8. root.geometry('450x350')
  9. root.title('test')
  10. #variables
  11. ent_releves1=StringVar()
  12. ent_releves2=StringVar()
  13.  

函数的部分代码

选择 | 换行 | 行号
  1. #Functions:
  2. def archiver():
  3.  
  4.     archive_monitoring={"date" : time.strftime('%d/%m/%y', time.localtime()),  
  5.                   "releves_mesure1": ent_releves1.get(),
  6.                   "releves_mesure2": ent_releves2.get(),                          }
  7.  
  8.     if (ent_releves1.get() !="" ) :
  9.         mon_fichier1 = open("save1/monitor1.txt", "r")
  10.         text1 = mon_fichier1.read()
  11.         mon_fichier1.close()                       
  12.         textInsert1=str(archive_monitoring["date"])+"\t" +str(archive_monitoring["releves_mesure1"])+"\n"
  13.         fileW1 = open("save1/monitor1.txt", "w")
  14.         fileW1.write(textInsert1 + text1)
  15.         fileW1.close()
  16.  
  17.     if (ent_releves2.get() !="" ) :
  18.         mon_fichier2 = open("save1/monitor2.txt", "r")
  19.         text2 = mon_fichier2.read()
  20.         mon_fichier2.close()                       
  21.         textInsert2=str(archive_monitoring["date"])+"\t" +str(archive_monitoring["releves_mesure2"])+"\n"
  22.         fileW2 = open("save1/monitor2.txt", "w")
  23.         fileW2.write(textInsert2 + text2)
  24.         fileW2.close()
  25.  
选择 | 换行 | 行号
  1. def affichage_update ():
  2.     with open('save1/monitor1.txt',"r") as monitor1, open('save1/monitor2.txt',"r") as monitor2:     
  3.         s= Scrollbar(releves)
  4.         T= Text(releves,bg='powder blue',width=450,height=350,font=('arial',14,'bold'),pady=25)   
  5.         s.pack(side=RIGHT, fill=Y)
  6.         T.pack(side=LEFT, fill=Y)
  7.         s.config(command=T.yview)
  8.         T.config(yscrollcommand=s.set)        
  9.         while True:
  10.             line1 = monitor1.readline()
  11.             if len(line1) == 0:
  12.                 break
  13.             line1 = line1.strip().split()
  14.             line2 = monitor2.readline()
  15.             line2 = line2.strip().split()
  16.             T.insert(END, f'{line1[0]:15}\t {line1[1]:10}\t\t {line2[1]:10}\n')
  17.     T.update_idletasks()
  18.     T.after(500,affichage_update)  
  19.  
  20.  

笔记本和标签代码:

选择 | 换行 | 行号
  1. container=ttk.Notebook(root,width=450,height=350)
  2. monitoring=Frame(container,bg='powder blue')
  3. container.add(monitoring,text='monitor data')
  4. releves=Frame(container,bg='powder blue')
  5. container.add(releves,text='releves')
  6. lbf1 = LabelFrame(monitoring, text="Lecture Monitor 1",padx=10, pady=10)
  7. lbf1.pack(side=LEFT,padx=10, pady=10,anchor=NE)
  8. entry_lbf1= Entry(lbf1,textvariable=ent_releves1)
  9. entry_lbf1.pack(pady=5)
  10. lbf2 = LabelFrame(monitoring, text="Lecture Monitor 2",padx=10, pady=10)
  11. lbf2.pack(side=LEFT,padx=10, pady=10,anchor=NW)
  12. entry_lbf2= Entry(lbf2,textvariable=ent_releves2)
  13. entry_lbf2.pack(pady=5)
  14. bt_archiver=Button(monitoring,text='Archiver',command=archiver)
  15. bt_archiver.place(x=40,y=120)
  16.  
选择 | 换行 | 行号
  1. generalites_top=Frame(releves,bg='powder blue',width=450)
  2. generalites_top.pack(side=TOP,fill=X)
  3. generalites_bottom=Frame(releves,bg='powder blue')
  4. generalites_bottom.pack(side=BOTTOM)
  5. head_axe_loc35L = ['Date', 'Monitor 1', 'Monitor 2']
  6. lb_date=Label(generalites_top,text=f'{head_axe_loc35L[0]:15}',bg='powder blue',font=('arial',12,'bold'))
  7. lb_date.pack(side=LEFT,padx=5,anchor=NW)
  8. lb_monitor1=Label(generalites_top,text=f'{head_axe_loc35L[1]:10}',bg='powder blue',font=('arial',12,'bold'))
  9. lb_monitor1.pack( side=LEFT)
  10. lb_monitor2=Label(generalites_top,text=f'{head_axe_loc35L[2]:10}',bg='powder blue',font=('arial',12,'bold'))
  11. lb_monitor2.pack(padx=70, side=LEFT)
  12.  
选择 | 换行 | 行号
  1. with open('save1/monitor1.txt',"r") as monitor1, open('save1/monitor2.txt',"r") as monitor2:        
  2.     s= Scrollbar(releves)
  3.     T= Text(releves,bg='powder blue',width=450,height=350,font=('arial',14,'bold'),pady=25)
  4.  
  5.     s.pack(side=RIGHT, fill=Y)
  6.     T.pack(side=LEFT, fill=Y)
  7.     s.config(command=T.yview)
  8.     T.config(yscrollcommand=s.set)        
  9.     while True:
  10.         line1 = monitor1.readline()
  11.         if len(line1) == 0:
  12.             break
  13.         line1 = line1.strip().split()
  14.         line2 = monitor2.readline()
  15.         line2 = line2.strip().split()
  16.         T.insert(END, f'{line1[0]:15}\t {line1[1]:10}\t\t {line2[1]:10}\n')
  17. T.update_idletasks()           
  18. T.after(500,affichage_update)  
  19. container.pack(expand=1, fill='both', padx=5, pady=5) 
  20. root.mainloop()
  21.  

我需要帮助来纠正我的代码
谢谢你的帮助

# 回答1


最有可能的是,While True正在独占处理器,不让任何其他事情发生。不是While True,而是重复调用另一个函数,使用After()更新文本,然后再次调用自身。在执行之前,After()等待的时间很短,这让处理器/Tkinter有时间做一些事情,比如更新小部件。对于任何其他While True循环,情况也是如此。对不起,有太多的代码让我费力地走完(你怎么会在这个阶段遇到这个问题。这段代码根本没有经过测试吗?)今天晚些时候会试着拿出一个简单的例子,但不能保证。
编辑:这是我工具箱中的代码。注意倒计时计时器如何创建标签,然后通过第二个函数更新它(简单的进度条与您的问题无关)。我还强烈建议您先学习类,然后再学习Tkinter,因为它解决了一些问题,比如访问在其他地方创建的调用函数中的变量。

选择 | 换行 | 行号
  1. class ProgressBar():
  2.     def __init__(self, root):
  3.         self.root=root
  4.         self.root.geometry("75x50+900+100")
  5.         tk.Button(self.root, text="Quit", bg="red", command=self.root.destroy).pack()
  6.         self.ctr=25
  7.         self.start_progress_bar()
  8.         self.start_countdown()
  9.  
  10.     def start_progress_bar(self):
  11.         """ create a simple progress bar widget on a canvas
  12.         """
  13.         self.top=tk.Toplevel(self.root, takefocus=True)
  14.         self.top.title("Progress Bar")
  15.         self.top.geometry("+700+200")
  16.         self.canvas = tk.Canvas(self.top, width=261, height=60, background='lightgray')
  17.         self.canvas.pack()
  18.  
  19.         self.rc1 = self.canvas.create_rectangle(24, 20, 32, 50, outline='white', \
  20.                                       fill='blue')
  21.         self.start_x=20
  22.         self.end_x=235
  23.         self.this_x=self.start_x
  24.         self.one_25th = (self.end_x-self.start_x)/25.0
  25.         rc2 = self.canvas.create_rectangle(self.start_x, 20, self.end_x, 50,
  26.                                        outline='blue', fill='lightblue')
  27.         self.rc1 = self.canvas.create_rectangle(self.start_x, 20, self.start_x+7, 50,
  28.                                        outline='white', fill='blue')
  29.  
  30.         self.update_scale()
  31.  
  32.     def start_countdown(self):
  33.         """ a separate process in a separate GUI
  34.         """
  35.         top2=tk.Toplevel(self.root, bg="lightyellow")
  36.         top2.geometry("50x25")
  37.         self.label_ctr = tk.IntVar()
  38.         self.label_ctr.set(self.ctr)
  39.         tk.Label(top2, textvariable=self.label_ctr, width=10,
  40.                  font=("Verdans", 15)).pack()
  41.         if self.ctr > 0:
  42.             self.update()
  43.         else:
  44.             self.top2.destroy()
  45.  
  46.     def update(self):
  47.         if self.ctr > 0:
  48.             self.label_ctr.set(self.ctr)
  49.             self.ctr -= 1
  50.             self.root.after(750, self.update)
  51.         else:
  52.             ## sleep for one second to allow any remaining after() to execute
  53.             ## can also use self.root.after_cancel(id)
  54.             self.root.after(1000, self.root.destroy)
  55.  
  56.     def update_scale(self):
  57.         self.canvas.move(self.rc1, self.one_25th, 0)
  58.         self.canvas.update()
  59.         self.this_x += self.one_25th
  60.         ## reverse direction at either end
  61.         if (self.this_x >= self.end_x-12) or self.this_x <= self.start_x+7:
  62.             self.one_25th *= -1
  63.  
  64.         ## only call after() while the countdown is running (self.ctr > 0)
  65.         ## to avoid a dangling after() when the program terminates
  66.         if self.ctr > 0:
  67.             self.canvas.after(200, self.update_scale)
  68.  
  69. root = tk.Tk()
  70.  
  71. PB=ProgressBar(root)
  72. root.mainloop() 

标签: python

添加新评论