Radiobutton,命令不起作用(python)
所以问题是,当我按下单选按钮时,没有任何变化——它们的命令没有被处理。如果按下Radiobutton,命令不起作用(python),python,tkinter,Python,Tkinter,所以问题是,当我按下单选按钮时,没有任何变化——它们的命令没有被处理。如果按下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,
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
#-*-编码:cp1250-*-
将numpy作为np导入
从scipy.optimize导入最小化
进口Tkinter
类别编号(Tkinter.Tk):
定义初始化(自身,父级):
Tkinter.Tk.\uuuuu init\uuuuuu(自,父)
self.parent=parent
self.title('Optimizacija funkcije')
自己几何图形('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初始化(自):
标签1=Tkinter.Label(self,text=u'Ovaj kod može izračunavati globalne ekstreme ravnine:')。位置(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)定义按钮命令
问题从这里开始:
redio1 = Tkinter.Radiobutton(..., command = self.a(-1)...)
您要求python在创建按钮时运行命令self.a(-1)
,并将该函数的结果分配给command
属性。command
属性需要对函数的引用,而不是对函数的调用
简短的回答是,docommand=lambda:self.a(-1)
。还有其他选择(例如:functools.partial
),但这是最简单的,不需要任何其他函数或导入的模块。当您调用lambda
时,您要求它返回对新(未命名或匿名)的引用函数。您要求,当该函数运行时,它应该调用self.a(-1)
。然后将此函数分配给命令
属性
布局您的小部件
在同一行代码中还有另一个问题,因此我也将在这里解决。当您执行此操作时:
redio1 = Tkinter.Radiobutton(...).place(...)
…所发生的事情是创建RadioButton
实例,调用place
方法,然后将place命令的结果分配给redio1
place
(和grid
,和pack
)都返回None
。因此,redio1
(和redio2
和redio3
和…)都设置为None
如果你想保留小部件的句柄,你必须创建它们并将它们放在两个单独的语句中。除了变量不会是None
,如果你将所有布局代码放在一个块中,这也会使代码更容易修改。根据我的经验,在开发过程中布局的变化比e核心小部件,因此将它们结合在一起可以更容易地可视化和修改
例如,我会这样组织代码:
label1 = Tkinter.Label(...)
label2 = Tkinter.Label(...)
...
dugmic1 = Tkinter.Button(...)
label1.place(...)
label2.place(...)
label3.place(...)
...
几何管理器
最后,让我再给你一条建议:不要使用place
。这会使您的GUI更难编写和维护,并且在调整窗口大小或用户具有不同字体或分辨率时,更难为GUI提供正确的行为。place
在非常罕见的情况下很有用,但在大多数情况下,您都需要应该学会使用pack
和/或grid