Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Radiobutton,命令不起作用(python)_Python_Tkinter - Fatal编程技术网

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
属性需要对函数的引用,而不是对函数的调用

简短的回答是,do
command=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