2013-12-18 56 views
-2

嗨,我制作了一个运行各种其他程序的程序。我导入模块并且对于没有涉及单选按钮的程序工作正常。带有单选按钮的程序在单独运行时可以正常工作。当它们通过我的菜单程序时,单选按钮不会给出IntVar值。任何人有任何想法如何解决这个问题?这些模块是我的程序,但他们都使用Tkinter。下面是菜单代码:用单选按钮导入模块时遇到问题 - python

from Tkinter import * 
def cmd(): 
    if var.get() == 1: 
     import animal_age_calculator 
     animal_age_calculator.createDisplay() 
    if var.get() == 2: 
     import temperatureCalculator 
     temperatureCalculator.createDisplay() 
    if var.get() == 3: 
     import calculator 
     calculator.createDisplay() 
    if var.get() == 4: 
     import currencyConverter 
     currencyConverter.createDisplay() 

def createDisplay(): 
    global var 
    root = Tk() 
    root.title('Calculator') 

    title = Label(root, text='Please Select which Calculator you would like to use',  font=50) 
    title.grid(row=0, column=0) 

    calcType = Frame(root) 
    calcType.grid(row=1, column=0) 
    var = IntVar() 
    animal = Radiobutton(calcType, text='Animal Age Calculator', variable=var, value=1) 
    animal.pack() 

    tempConverter = Radiobutton(calcType, text='Temperature Calculator', variable=var, value=2) 
    tempConverter.pack() 

    calc = Radiobutton(calcType, text='Calculator', variable=var, value=3) 
    calc.pack() 

    currency = Radiobutton(calcType, text='Currency Converter', variable=var, value=4) 
    currency.pack() 

    select = Button(root, text='Go', command=cmd) 
    select.grid(row=2, column=0) 

    root.mainloop() 

if __name__ == '__main__': 
    createDisplay() 

下面是单选按钮节目之一代码:

from Tkinter import * 
def convert(temperature): 
    global var4 
    a = var4.get() 
    print(str(a)) 
    if a == 1: 
     print 'test2' 
     display.delete(1.0, END) 
     finalTemp = int(temperature)*1.8+32 
     finalTemp = round(finalTemp, 1) 
     display.insert(INSERT, finalTemp) 
    if a == 2: 
     display.delete(1.0,END) 
     finalTemp = int(temperature)-32/1.8 
     finalTemp = round(finalTemp, 1) 
     display.insert(INSERT, finalTemp) 

def createDisplay(): 
    global display, var4 
    root = Tk() 
    root.title('Temperature Converter') 
    root.resizable(width=False, height=False) 

    title = Label(root, text="Welcome to the temperature converter", font=36) 
    title.grid(row=0, column=1, columnspan=3) 

    selTemp = LabelFrame(root, text="Please select your temperature") 
    selTemp.grid(row=1, column=2) 

    temp = Scale(selTemp, orient=HORIZONTAL, sliderlength=20, from_=0, to=250, length=250, command=convert) 
    temp.pack() 
    temperature = temp.get() 

    displayFrame = LabelFrame(root, text="Your converted temperature is") 
    displayFrame.grid(row=1, column=3) 
    display = Text(displayFrame, width=6, height=1) 
    display.pack() 

    var4 = IntVar() 
    tempType = LabelFrame(root, text='Please select your temperature you would like to convert') 
    tempType.grid(row=1, column=1) 
    celcius = Radiobutton(tempType, text="Celcius", variable=var4, value=1) 
    celcius.pack() 
    fahrenheit = Radiobutton(tempType, text="Fahrenheit", variable=var4, value=2) 
    fahrenheit.pack() 
    root.mainloop() 

if __name__ == '__main__': 
    createDisplay() 
+1

你能举一些例子代码吗?也请提供您正在使用的模块的详细信息。 – Ffisegydd

+0

模块是我自己的Python代码,但它们都使用Tkinter。 –

+2

这是一个好的开始,但您可能需要给出一些示例代码供人们在尝试解决您的问题时与之合作:)如果您遇到错误,那么如果您还可以提供可能有用的Traceback。 – Ffisegydd

回答

0

问题的关键是,你要创建的Tk两个实例。你不能那样做。 Tkinter是专门为您创建的,在任何时候都只创建一个Tk的单个实例。您的模块应创建实例Toplevel而不是Tk的实例,并且在模块导入时,它们不应创建新的事件循环。

+0

我现在就试试这个......如果你说的是真的,为什么没有单选按钮的程序工作正常? –

+0

@DecStanley:这是不可能的,但我猜想这是因为这些其他程序不使用IntVars或StringVars。这个问题可能比这更深入,在评论框中回答太深。可以这么说,Tkinter的设计并不是在同一个过程中同时运行两个Tk实例。 –