所以问题是,当我按下radiobuttons时,没有任何变化 - 它们的命令没有被处理。如果按下radio2
和radio4
,我总会得到结果。请帮忙!
# -*- 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
答案 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
(以及place
和grid
)都返回pack
。因此,None
(以及redio1
和redio2
和...)都设置为redio3
。
如果要保留小部件的句柄,则必须创建它们并将它们放在两个单独的语句中。除了您的变量不是None
之外,如果您将所有布局代码放在一个块中,这也会使您的代码更容易修改。根据我的经验,布局在开发过程中比核心小部件更改了很多,因此将它们放在一起可以更容易地进行可视化和修改。
例如,我会像这样组织代码:
None
几何经理
最后,让我再给你一条建议:不要使用label1 = Tkinter.Label(...)
label2 = Tkinter.Label(...)
...
dugmic1 = Tkinter.Button(...)
label1.place(...)
label2.place(...)
label3.place(...)
...
。它使您的GUI更难以编写和维护,并且在调整窗口大小或人们拥有不同的字体或分辨率时,更难以为GUI提供正确的行为。 place
在非常罕见的情况下很有用,但在大多数情况下,您应该学会使用place
和/或pack
。