![]() |
[Tkinter] Label doesn't refresh - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: GUI (https://python-forum.io/forum-10.html) +--- Thread: [Tkinter] Label doesn't refresh (/thread-11469.html) |
Label doesn't refresh - jollydragon - Jul-10-2018 With below code, the label of directory path doesn't be refreshed correctly after I change the directory with "Ctrl+o". E.g. When you change it to "C:\", you can see the new label is displayed on old label. How to refresh it to show the new label only? I searched on the internet for 2 dys, no matter update(), destroy() or anything working in my Python v3.6.5. import tkinter import tkinter.filedialog import os class fileData: def __init__(self): self.targetDir = "./" self.mainWin = tkinter.Tk() def reportShow(self): ln1 = 2 tkinter.Label(self.mainWin, text = " Target ",justify = tkinter.LEFT).grid(row = ln1, column =0) absPath = os.path.abspath(self.targetDir) if len(absPath) > 40: absPath = ' ...%s' % absPath[-37:] tkinter.Label(self.mainWin, text = absPath, background='white').grid(row = ln1, column = 1, columnspan = 3) def chooseFolder(): #This is where we lauch the directory change bar filesData.targetDir = tkinter.filedialog.askdirectory(title = "Choose the target directory", initialdir=filesData.targetDir) filesData.reportShow() def showMain(): mainWin = filesData.mainWin winSize = 360 mainWin.geometry('%dx%d+%d+%d' % (winSize, winSize, (mainWin.winfo_screenwidth()-winSize)/2, (mainWin.winfo_screenheight()-winSize)/2)) #The size and position of the main window mainWin.minsize(winSize,winSize) mainWin.bind('<Control-o>',lambda event: chooseFolder()) filesData.reportShow() mainWin.mainloop() filesData = fileData() if __name__=="__main__": showMain() RE: Label doesn't refresh - Axel_Erfurt - Jul-10-2018 it works by commenting the line # if len(absPath) > 40: absPath = ' ...%s' % absPath[-37:]There must be a problem with this line RE: Label doesn't refresh - Larz60+ - Jul-10-2018 add to __init__ self.abspathv = tkinter.StringVar()Then modify Label: tkinter.Label(self.mainWin, text = absPath, textvariable=self.abspathv, background='white').grid(row = ln1, column = 1, columnspan = 3)and finally set it with: self.abspath.set('vlaue goes here') RE: Label doesn't refresh - jollydragon - Jul-11-2018 (Jul-10-2018, 10:41 AM)Axel_Erfurt Wrote: it works by commenting the line Thanks for reminding. But why is it that line? How to modify? (Jul-10-2018, 02:01 PM)Larz60+ Wrote: add to __init__ Thank you so much and it works. But why the variable "tkinter.StringVar()" must be defined in "__init__()"? Why can't in the function of class? RE: Label doesn't refresh - Larz60+ - Jul-11-2018 It doesn't have to be in __init__. This is a habit of mine as I tend to access from several methods, but it can be used in local scope. RE: Label doesn't refresh - jollydragon - Jul-12-2018 (Jul-11-2018, 07:55 AM)Larz60+ Wrote: It doesn't have to be in __init__. No, it doesn't work in local scope. I moved it to local scope as the code below and you can try. You'll find the label doesn't refresh correctly if changing the directory path from a long one to short. import tkinter import tkinter.filedialog import os class fileData: def __init__(self): self.targetDir = "./" self.mainWin = tkinter.Tk() def reportShow(self): ln1 = 2 absPathv = tkinter.StringVar() tkinter.Label(self.mainWin, text = " Target ",justify = tkinter.LEFT).grid(row = ln1, column =0) absPath = os.path.abspath(self.targetDir) if len(absPath) > 40: absPath = ' ...%s' % absPath[-37:] absPathv.set(absPath) tkinter.Label(self.mainWin, textvariable = absPathv, background='white').grid(row = ln1, column = 1, columnspan = 3) def chooseFolder(): #This is where we lauch the directory change bar filesData.targetDir = tkinter.filedialog.askdirectory(title = "Choose the target directory", initialdir=filesData.targetDir) filesData.reportShow() def showMain(): mainWin = filesData.mainWin winSize = 360 mainWin.geometry('%dx%d+%d+%d' % (winSize, winSize, (mainWin.winfo_screenwidth()-winSize)/2, (mainWin.winfo_screenheight()-winSize)/2)) #The size and position of the main window mainWin.minsize(winSize,winSize) mainWin.bind('<Control-o>',lambda event: chooseFolder()) filesData.reportShow() mainWin.mainloop() filesData = fileData() if __name__=="__main__": showMain() RE: Label doesn't refresh - Larz60+ - Jul-12-2018 And if it works in __init__ is what is the objection to keeping it there? It's still local to the class. RE: Label doesn't refresh - jollydragon - Jul-13-2018 (Jul-12-2018, 12:21 PM)Larz60+ Wrote: And if it works in __init__ is what is the objection to keeping it there? It's still local to the class. Got it and thank you very much. |