Radiobutton,命令不起作用(python)

时间:2014-02-04 17:03:38

标签: python tkinter

所以问题是,当我按下radiobuttons时,没有任何变化 - 它们的命令没有被处理。如果按下radio2radio4,我总会得到结果。请帮忙!

# -*- coding: cp1250 -*-

import numpy as np
from scipy.optimize import minimize
import Tkinter 

class numerika(Tkinter.Tk):

def __init__(self, parent):
    Tkinter.Tk.__init__(self, parent)
    self.parent = parent
    self.title('Optimizacija funkcije')
    self. geometry('500x300')
    self.uvjeti = ({'type': 'ineq', 'fun': lambda x: np.array([-x[0]-2*x[1]+4.0])},
                   {'type': 'ineq', 'fun': lambda x: np.array([-4*x[0] - 2*x[1] +12.0])},
                   {'type': 'ineq', 'fun': lambda x: np.array([x[0]-x[1]+1.0])},
                   {'type': 'ineq', 'fun': lambda x: np.array([x[0]])},
                   {'type': 'ineq', 'fun': lambda x: np.array([x[1]])})
    self.initialize()


def initialize(self):

    label1 = Tkinter.Label(self, text = u'Ovaj kod može izračunavati globalne ekstreme ravnine:').place(x = 10, y = 10)
    label2 = Tkinter.Label(self, text = u'z = x1 +x2,').place(x = 70, y = 30)
    label3 = Tkinter.Label(self, text = u'za zadane uvjete:').place(x = 70, y = 50)
    label4 = Tkinter.Label(self, text = u'x1+2*x2 <= 4,    4*x1+2*x2 <= 12,    -x1+x2 <= 1,    x1 >= 0,    x2 >= 0.').place(x = 70, y = 70)
    label5 = Tkinter.Label(self, text = u'Odaberi tip ekstrema:').place(x = 10, y = 110)
    label6 = Tkinter.Label(self, text = u'Odaberi metodu solvera:').place(x = 200, y = 110)

    redio1 = Tkinter.Radiobutton(self, text = 'Maksimum', value = 1, variable = 1, command = self.a(-1)).place(x = 30, y = 140)
    radio2 = Tkinter.Radiobutton(self, text = 'Minimum', value = 2, variable = 1, command = self.a(1)).place(x = 30, y = 170)

    radio3 = Tkinter.Radiobutton(self, text = 'COBYLA', value = 3, variable = 2, command = self.b('COBYLA')).place(x = 220, y = 140)
    radio4 = Tkinter.Radiobutton(self, text = 'SLSQP', value = 4, variable = 2, command = self.b('SLSQP')).place(x = 220, y = 170)

    dugmic1 = Tkinter.Button(self, text = u'Izračunaj!', height = 3, bd = 3, command = self.racunaj).place(x = 390, y = 140 )

def racunaj(self):
    rj = minimize(self.f, [1.0, 1.0], method = self.m, constraints = self.uvjeti)
    self.rj = rj

def f(self,x):
    x1 = x[0]
    x2 = x[1]
    return self.k*(x1+x2)

def a(self, k):
    self.k = k


def b(self, m):
    self.m = m


app=numerika(None)     

app.mainloop()



print app.rj

1 个答案:

答案 0 :(得分:2)

定义按钮命令

问题从这里开始:

redio1 = Tkinter.Radiobutton(..., command = self.a(-1)...)

您要求python在您创建按钮时运行命令self.a(-1) ,并将该函数的结果分配给command属性。 command属性需要引用到函数,而不是对函数的调用。

简短的回答是,command=lambda: self.a(-1)。还有其他选择(例如:functools.partial),但这是最简单的,不需要任何其他功能或导入的模块。当您致电lambda时,您要求它返回对新(未命名或匿名)功能的引用。你问的是,当该函数运行时,它应该调用self.a(-1)。然后将此函数分配给command属性。

布置小部件

你在同一行代码上有另一个问题,所以我也会在这里解决它。当你这样做时:

redio1 = Tkinter.Radiobutton(...).place(...)

...会发生什么?创建RadioButton实例,调用place方法,然后将place命令的结果分配给{{1 }}。 redio1(以及placegrid)都返回pack。因此,None(以及redio1redio2和...)都设置为redio3

如果要保留小部件的句柄,则必须创建它们并将它们放在两个单独的语句中。除了您的变量不是None之外,如果您将所有布局代码放在一个块中,这也会使您的代码更容易修改。根据我的经验,布局在开发过程中比核心小部件更改了很多,因此将它们放在一起可以更容易地进行可视化和修改。

例如,我会像这样组织代码:

None

几何经理

最后,让我再给你一条建议:不要使用label1 = Tkinter.Label(...) label2 = Tkinter.Label(...) ... dugmic1 = Tkinter.Button(...) label1.place(...) label2.place(...) label3.place(...) ... 。它使您的GUI更难以编写和维护,并且在调整窗口大小或人们拥有不同的字体或分辨率时,更难以为GUI提供正确的行为。 place在非常罕见的情况下很有用,但在大多数情况下,您应该学会使用place和/或pack