On 28 Dic, 09:44, Ren Wenshan <renws1...@gmail.com> wrote: > Hi, everyone: > > I am new to programming and Python and these days I've been working > on a > tiny program for practice and encountered with a problem. > > My tiny program read a line from a data file one time, and store it > in a list, till the list is full. This is the init. > Then when I press Button Start, I want the program will read a > line, > list.pop(0) list.append(line) in a loop. Thus, make the labels > scrolling. > English is not my mother tongue, I hope I've made myself > understood. > > the whole source code: > > from Tkinter import * > import sys > import time > > # position of buttons > row_button = 5 > col_button = 4 > > # font size > size_title = 20 > size_button = 12 > size_text = 14 > > # the length of name_list > Len_List = 3 > > class meal( Frame ): > > def __init__(self): > Frame.__init__(self) > self.pack( expand = YES, fill = BOTH) > self.master.title("Languages") > > self.label_1 = Label(self, text = "Too many languages to > choose...", font = ("arial", size_title)) > self.label_2 = Label(self, text = "Which is the Lucky one", > font = ("arial", size_title-4)) > self.label_1.grid(row = 0, column = 0) > self.label_2.grid(row = 1, column = 2) > > self.button_start = Button(self, text = "start", font = > ("arial", size_button), command = self.start) > self.button_stop = Button(self, text = "stop", font = > ("arial", size_button)) > self.button_quit = Button(self, text = "quit", font = > ("arial", size_button), command = self.quit) > > self.button_start.grid(row = row_button, column = col_button) > self.button_stop.grid(row = row_button, column = col_button+1) > self.button_quit.grid(row = row_button,column = col_button+2) > > self.name_list = [None] * Len_List > self.label_list = [None] * Len_List > > self.fp = open("data.txt", 'r') > for i in range(Len_List): > self.name_list[i] = self.fp.readline() > for i in range(Len_List): > self.label_list[i] = Label(self, text = self.name_list[i], > font = ("arial", 12)) > self.label_list[i].grid(row = 2+i, column = 2) > > def start(self): > self.line = self.fp.readline() > if not self.line: > self.fp.seek(0) > self.line = self.fp.readline() > self.name_list.pop(0) > self.name_list.append(self.line) > > for i in range(Len_List): > self.label_list[i].destroy() > self.label_list[i] = Label(self, text = self.name_list[i], > font = ("arial", 12)) > self.label_list[i].grid(row = 2+i, column = 2) > > def quit(self): > sys.exit(0) > > app = meal() > app.mainloop() > > Best wishes > > Vincent Ren
Hi, if you want to realize an 'animated scrolling' effect, you need to move the scrolling code out of the start callback in a function which is called periodically by the GUI mainloop. In Tkinter, you can do that using Toplevel.after to have a fuction be called after a timeout. Here is your 'meal' class with the modifications needed to make an 'animated scroll'. I renamed your start method as _scroll_text and wrote new start and stop methods to start and stop the scrolling. Ciao ----- FB lass meal( Frame ): SCROLL_DELAY = 500 # milliseconds def __init__(self): Frame.__init__(self) self.pack( expand = YES, fill = BOTH) self.master.title("Languages") self.label_1 = Label(self, text = "Too many languages to choose...", font = ("arial", size_title)) self.label_2 = Label(self, text = "Which is the Lucky one", font = ("arial", size_title-4)) self.label_1.grid(row = 0, column = 0) self.label_2.grid(row = 1, column = 2) self.button_start = Button(self, text = "start", font = ("arial", size_button), command = self.start) self.button_stop = Button(self, text = "stop", font = ("arial", size_button), command = self.stop ) self.button_quit = Button(self, text = "quit", font = ("arial", size_button), command = self.quit) self.button_start.grid(row = row_button, column = col_button) self.button_stop.grid(row = row_button, column = col_button+1) self.button_quit.grid(row = row_button,column = col_button+2) self.name_list = [None] * Len_List self.label_list = [None] * Len_List self.fp = open("data.txt", 'r') for i in range(Len_List): self.name_list[i] = self.fp.readline() for i in range(Len_List): self.label_list[i] = Label(self, text = self.name_list[i], font = ("arial", 12)) self.label_list[i].grid(row = 2+i, column = 2) self.after_id = None def _scroll_text(self): #print "_scroll_text" self.line = self.fp.readline() if not self.line: self.fp.seek(0) self.line = self.fp.readline() self.name_list.pop(0) self.name_list.append(self.line) for i in range(Len_List): self.label_list[i].destroy() self.label_list[i] = Label(self, text = self.name_list[i], font = ("arial", 12)) self.label_list[i].grid(row = 2+i, column = 2) self.after_id = self.master.after(self.SCROLL_DELAY, self._scroll_text) def start(self): self.after_id = self.master.after(self.SCROLL_DELAY, self._scroll_text) def stop(self): if self.after_id: self.master.after_cancel(self.after_id) self.after_id = None def quit(self): sys.exit(0) -- http://mail.python.org/mailman/listinfo/python-list