【问题标题】:how to update command of tkinter button?如何更新 tkinter 按钮的命令?
【发布时间】:2017-06-08 19:40:54
【问题描述】:

我有一个函数 fonc(a,b,c,bool1,bool2) 接受浮点 (a,b,c) 和布尔参数。 此函数可以根据布尔值绘制不同类型的图形(使用 matplotlib),这些图形取决于浮点值。

我正在尝试在 tkinter 中为这个功能制作一个“图形界面”。在此界面中,我可以使用复选框更改布尔值,并使用旋转框和“启动”按钮浮动,该按钮使用当前参数启动函数并在界面中绘制。

我会尝试先用一个复选框来制作它,这就是问题所在,按钮启动的部分命令的功能是静态的。我的意思是它采用我放置的默认参数并且永远不会更改,即使使用我的复选框来更改参数的值。

这是我的代码,函数是testpanneau.testpanneau1,我的布尔值是toutedir2

import tkinter as tk
import testpanneau
from functools import partial

"""constantes"""
latitude = 37.77
longitude = -122.42
j = 21
m = 12
a = 2016
timezone = -8
hauteurlieu = 0.282
costheta = False
toutedir1 = False
toutedir2 = True
infonord = False
cst = 32

"""definition de la fonction de changement de booleen"""
def chgtbool1():
    print("Button clicked")
    toutedir2 = True if is_checked.get() else False
    print(toutedir2)

"""creation de ma fenetre"""
mafenetre = tk.Tk()
mafenetre.title('Test irradiance')
mafenetre.geometry('600x200')


"""definition des boolen des checkbox"""
#toutedir2
is_checked = tk.BooleanVar()
#toutedir1
#costheta
#infonord

"""creation des checkbox"""
checkbox = tk.Checkbutton(mafenetre, variable=is_checked, command=chgtbool1)

"""Création d'un widget Button (bouton Quitter)"""
Bouton1 = tk.Button(mafenetre, text = 'Quitter', command = mafenetre.destroy)

""" Création d'un widget Button (bouton Lancer)"""
BoutonLancer = tk.Button(mafenetre, text ='generer', command = partial(testpanneau.testpanneau1,latitude,longitude,j,m,a,timezone,hauteurlieu,cst,costheta,toutedir1,toutedir2,infonord))

"""Positionnement du widget avec la méthode pack()"""
checkbox.pack(side = tk.LEFT, padx = 5, pady = 7)
Bouton1.pack()
BoutonLancer.pack(side = tk.RIGHT, padx = 5, pady = 0)

""" Lancement du gestionnaire d'événements"""
mafenetre.mainloop()

【问题讨论】:

    标签: python user-interface button tkinter


    【解决方案1】:

    仍然非常不确定目标,但是这段代码片段演示了如何(动态)更新按钮的命令,这就是本期的标题。

    def generer() :
        Boutonint = tk.Button(mafenetre, text = 'lancer', command = someAction)
        Boutonint.pack(side = tk.RIGHT, padx = 3, pady = 0)
    
    def noPlot():
        BoutonLancer['command'] = noPlot
        print("Making plot...")
    
    def someAction():
        print('lancer button caused this')
    
    """definition de la fonction de changement de booleen"""
    def chgtbool1():
        print("Button clicked")
        toutedir2 = is_checked.get()
        if toutedir2:
            BoutonLancer['command'] = generer
        else:
            BoutonLancer['command'] = noPlot
        print(toutedir2)
    

    【讨论】:

    • 谢谢你,但我什么时候更新命令?我怎么知道我是否必须这样做?
    • 我假设您想根据检查按钮的值 (True/False) 更改另一个按钮(不是检查按钮)将执行的功能。如果是这种情况,button_object 语句将进入该函数 (chgtbool1)。根据checkbutton的值,写对应的语句来匹配
    • 请为您的回答提供更多背景信息。仅仅写一行代码并不是真正的good answer,并且可能无法帮助其他有类似问题的人。总是更好地理解你为什么要做某事,然后只是“在这里做这个”而不做任何解释。
    • 请尝试我提交的更新代码片段,看看是否接近您的需要。
    • 我将对其进行重新表述,使其更加通用和易于理解
    【解决方案2】:

    当您创建partial() 时,它是使用变量at the time it is created的值创建的:

    partial() 用于“冻结”的部分函数应用程序 函数参数和/或关键字的某些部分导致 具有简化签名的新对象....

    如这个简单的例子所示:

    >>> from functools import partial
    >>> i = 3
    >>> def prt(a):
    ...     print a
    ...
    >>> x = partial(prt, i)
    >>> x()
    3
    >>> i = 5
    >>> x()
    3
    

    单击文本框的次数不会改变运行command 时看到的值。

    当您创建部分时,您需要做的是传入is_checked,然后在您的函数testpanneau.testpanneau1 中,执行is_checked.get() 以获得布尔值。您也可以取消 chgtbool1() 函数。

    此代码有效,我已将testpanneau.testpanneau1 替换为myfun(),并且按下generer 按钮时复选框的值正确打印。

    import tkinter as tk
    from functools import partial
    
    """constantes"""
    latitude = 37.77
    longitude = -122.42
    j = 21
    m = 12
    a = 2016
    timezone = -8
    hauteurlieu = 0.282
    costheta = False
    toutedir1 = False
    toutedir2 = True
    infonord = False
    cst = 32
    
    def myfun(*args):
        print args[10].get()
    
    """creation de ma fenetre"""
    mafenetre = tk.Tk()
    mafenetre.title('Test irradiance')
    mafenetre.geometry('600x200')
    
    
    """definition des boolen des checkbox"""
    #toutedir2
    is_checked = tk.BooleanVar()
    #toutedir1
    #costheta
    #infonord
    
    """creation des checkbox"""
    checkbox = tk.Checkbutton(mafenetre, variable=is_checked)
    
    """Creation d'un widget Button (bouton Quitter)"""
    Bouton1 = tk.Button(mafenetre, text = 'Quitter', command = mafenetre.destroy)
    
    """ Creation d'un widget Button (bouton Lancer)"""
    BoutonLancer = tk.Button(mafenetre, text ='generer', command = partial(myfun,latitude,longitude,j,m,a,timezone,hauteurlieu,cst,costheta,toutedir1,is_checked,infonord))
    
    """Positionnement du widget avec la methode pack()"""
    checkbox.pack(side = tk.LEFT, padx = 5, pady = 7)
    Bouton1.pack()
    BoutonLancer.pack(side = tk.RIGHT, padx = 5, pady = 0)
    
    """ Lancement du gestionnaire d'evenements"""
    mafenetre.mainloop()
    

    抱歉,我不得不将您的 cmets 英语化,因为我的 Python 2.7 解释器抱怨重音字符

    【讨论】:

      【解决方案3】:

      我通过使用函数 uptade 解决了我的问题,该函数使用新的部分函数更新了我的命令:

      def maj():
          global BoutonLancer
          BoutonLancer['command'] = partial(testpanneau.testpanneau1,latitude,longitude,j,m,a,timezone,hauteurlieu,cst,costheta,toutedir1,toutedir2,infotheta,beta,gamma)
      

      谢谢大家的帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-14
        • 2023-02-24
        • 1970-01-01
        • 2019-10-06
        • 1970-01-01
        • 2020-11-18
        • 1970-01-01
        相关资源
        最近更新 更多