我将单一语言GUI转换为必须支持多种语言的GUI。这个想法是当用户选择"语言" radiobutton GUI上的ALL everthing立即切换到所选语言。当radiobutton改变但GUI不会更新(切换语言)时,使python字符串正确更新没有问题。
文本字符串(适用于所有语言)和在语言之间切换的代码在“LanguageInUse.py”中被隔离(见下文)。 GUI对象的text / textvariable属性的初始设置是通过在对象创建之后(而不是在)期间立即调用关联的.config()方法来完成的。
动态修改文本字符串需要" root" - 最顶层的GUI对象 - 是“应用程序级全局”(使其成为"只读"可在其他模块中访问)。根据{{3}}" root"在其自己的文件(tkinterRoot.py)中创建,使其可由任何模块导入 (BTW,“root”在创建之后永远不会改变。所以使用“应用程序级别”全局避免了必须通过在应用程序的调用层次结构中的每个调用中添加一个新的,基本上无用的参数来修改现有代码。文件。)
根据“脏解决方案”对Python: How can I use variable from main file in module?的回复,对 root.update() - 或 root.update_idletasks()的调用立即完成更改python字符串后,GUI不会更改。
我更喜欢使用“.configure()”方法(根据Bryan Oakleys对Python tkinter: Update GUI between subprocess calls的回答)而不是StringVars和.update()/。update_idletasks()。
我错过了什么?
我的环境是使用Eclipse Mars(使用便携式java 8)和Pydev 4.5.5的Win7 Enterprise SP1,Python 3.2.2。
以下严格编辑的代码片段显示了正在使用的方法。
TkinterRoot.py(完整地):
from tkinter import Tk
root = Tk()
LanguageInUse.py:
import TkinterRoot
English = 'English' # the default language
Francais = 'Fran' + "\u00E7" + 'ais' # 00E7 = c_cedille in Win 7 character set
Espanol = "Espanol" # not implemented
DefaultLanguage = Francais #Emulates the startup "argv" parameter
GUI_language = DefaultLanguage # current GUI language (set by a radiobutton)
EmptyString = ""
# Create every language dependent string as an “application level global” until
# a better approach is found. (Don’t like a massive file containing the GUI
# text in all languages but one thing at a time… Worse is sprinkling the
# language change code throughout the many modules of the application.)
Title0 = EmptyString
Title1 = EmptyString
Title2 = EmptyString
def SetGuiLanguage( user_language ) :
global Title0
global Title1
global Title2
if ( GUI_language == English ):
Title0 = "Message Counts"
Title1 = "Communications Compliance"
Title2 = "Site Specific"
elif ( GUI_language == Francais ):
Title0 = "Comtes de message"
Title1 = "Compliance Communications"
Title2 = "Spécifique du site"
else: # any other langauge
System.exit() # dummy for other code
# TkinterRoot.root.update() # doesn't update GUI when language changes
TkinterRoot.root.update_idletasks() # doesn't update GUI when language changes
'''-------------'''
# Sets up GUI text strings during initialization
SetGuiLanguage( DefaultLanguage )
应用主线:
from tkinter import Tk, Toplevel, Frame, Button, N, W, E, S
from TkinterRoot import root
import LanguageOfUse
# Start of main program
LanguageInUse.SetGuiLanguage( LanguageInUse.GUI_language )
# Set up all GUI elements (includes the language selection radiobutton)
ConstructTheGui.ConstructTheGui( root )
root.mainloop()