Python:在Pmw RadioSelect中引用单个标签

Python:在Pmw RadioSelect中引用单个标签,python,tkinter,pmw,Python,Tkinter,Pmw,我想创建一个悬停框(或信息框),当用户将鼠标光标放在Pmw RadioSelect标签的顶部时,它会打开。例如,当光标放在“Primary”的顶部时,程序会打开一个信息框,解释“Primary”的含义 问题:我不知道如何访问RadioSelect对象内的各个标签。我需要将一个方法绑定到各个标签,但我不知道如何引用它们 额外:我怎么能自己解决这个问题?我尝试使用dir()查看RadioSelect属性,并联机阅读了Pmw手册,但找不到相关信息 编辑这是我迄今为止发现的:声明标签只有在明确设置其位

我想创建一个悬停框(或信息框),当用户将鼠标光标放在Pmw RadioSelect标签的顶部时,它会打开。例如,当光标放在“Primary”的顶部时,程序会打开一个信息框,解释“Primary”的含义

问题:我不知道如何访问RadioSelect对象内的各个标签。我需要将一个方法绑定到各个标签,但我不知道如何引用它们

额外:我怎么能自己解决这个问题?我尝试使用dir()查看RadioSelect属性,并联机阅读了Pmw手册,但找不到相关信息

编辑这是我迄今为止发现的:声明标签只有在明确设置其位置时才开始存在:

labelpos

初始化选项。指定放置标签组件的位置

如果,则不会创建标签组件。默认值为None

明确设置后,例如:

self.rs = Pmw.RadioSelect(parent, labelpos = 'w')
你可以参考它 self.rs.component('标签')

但我仍然不知道如何接触到个人标签

编辑2:诀窍就是将无线电选择“项”分配到变量中,如接受的答案所示:

self.cb1 = self.radio_select.add("text")
将“项”赋给变量后,只需将方法绑定到变量,如下所示:

self.balloon = Pmw.Balloon(self, initwait=500, relmouse='both')
self.balloon.bind(self.cb1, "Balloon text example")

如果我很了解您的问题,我认为您正在寻找:

  • 依靠Pmw来绘制小部件(与我之前使用Tkinter所做的不同)
  • 当光标放在“Primary”的顶部时,程序会打开一个信息框,解释“Primary”的含义。(我在下面的演示中产生的效果)
  • 识别各个复选按钮(或您在
    Pmw.RadioSelect
    中的各个标签中使用自己的术语)
  • 解决方案:
  • 第一个问题的解决方案你已经知道了
  • 对于第二个问题,正如我前面所解释的,您需要实例化
    Pmw.Balloon()
    ,并将其绑定到各个复选按钮(或您所称的标签)。我重新编程,正如你在下面看到的,但使用了另一种方法。我的意思是,我主要依赖于返回组件小部件的。然后我将
    Pmw.Balloon()
    的实例绑定到
    add()
    返回的值。这样做,您已经为自己提供了一种单独访问复选按钮的方法(如果您愿意,您可以更多地使用它)
  • 您可以使用或方法访问各个复选按钮(标签),这些方法的工作原理类似于返回当前选定按钮的名称但是在实践中,您将得到元组(我的意思是这些函数返回所有选定复选按钮的名称,如我在
    access\u to\u labels\u individually()中所示,
    我使用它作为回调方法来显示您选择的复选按钮的名称;当然,您也可以根据需要使用它)
  • 代码 以下是一个程序:

    演示 (我保留相同的屏幕截图,因为上面的程序产生相同的结果)

    以下是与鼠标悬停在每个
    tkinter.Checkbutton()
    实例上(无论是否选中)相关的正在运行的程序的屏幕截图:


    我感谢您的努力,并且喜欢使用Pmw气球的想法。我想我以后会把它应用到我的程序中。然而,你的回答并没有回答我的问题。问题是如何访问或引用Pmw RadioSelect中的单个标签。我把你的答案填上去了,但是如果有人对这个问题有直接的答案,我会等一等。如果我理解了你的编辑,你是想访问Primary?您要查找的复选按钮必须使用
    Pmw.RadioSelect()
    绘制,这与我所做的不同?如果是这种情况,则可以使用
    getcurselection()
    getvalue()
    方法。如果您不了解手册中这两种方法的工作原理,我可以为您提供一个代码示例@CrebitI根据你说的重新编码了程序。但当我讲完的时候,我想我(再次)误解了你所说的标签。我回来后会继续解决。请让我知道,如果这是你正在寻找或没有@你改变了密码,克里比接受了答案。在RadioSelect中获取值时,我没有遇到任何困难。相反,我不知道如何将方法绑定到RadioSelect的“文本”部分。但通过在添加它们时将它们分配给变量(
    self.cb1=self.checkbuttons.add('Primary')
    ),我后来能够引用它们并将方法绑定到它们。谢谢你的热情和透彻的回答!我回来了。你的意思是:但我仍然不知道如何到达个别标签?我问这个问题是因为我相信你已经在
    self.rs.component('label')
    中回答了这个问题,所以…?嗨,比尔!我希望我的问题没有含糊不清。通过访问各个标签,我的意思是:
    self.balloon.bind(self.cb1,“balloon text”)
    。我试图找到一种方法,在你的答案中有一个类似self.cb1的引用,以便能够将一个方法绑定到它。现在,当我看到我可以像你在回答中那样分配一个变量时,我觉得很傻:
    self.cb1=self.checkbuttons.add('Primary')
    '''
    Created on Jun 18, 2016
    
    @author: Billal BEGUERADJ
    '''
    # -*- coding: utf-8 -*-
    import Pmw
    import tkinter as tk
    
    class Begueradj:
       def __init__(self, parent):
    
           self.balloon = Pmw.Balloon(parent) 
    
           # Create and pack a vertical RadioSelect widget, with checkbuttons.
           self.checkbuttons = Pmw.RadioSelect(parent,
               buttontype = 'checkbutton',
               orient = 'vertical',
               labelpos = 'w',
               command = self.access_to_labels_individually,
               hull_borderwidth = 2,
               hull_relief = 'ridge',
            )
           self.checkbuttons.pack(side = 'left', expand = 1, padx = 10, pady = 10)
    
           # Add some buttons to the checkbutton RadioSelect        
           self.cb1 = self.checkbuttons.add('Primary')
           self.cb2 = self.checkbuttons.add('Secondary')
           self.cb3 = self.checkbuttons.add('Tertiary')
           # Bind the Balloon instance to each widget
           self.balloon.bind(self.cb1, 'Primary:\n This is our primary service')
           self.balloon.bind(self.cb2, 'Secondary:\n This is our primary service')
           self.balloon.bind(self.cb3, 'Tertiary:\n This is our primary service')  
    
    
    
       # You can use getvalue() or getcurselection() to access individual labels    
       def access_to_labels_individually(self, tag, state):
           print(self.checkbuttons.getvalue())            
    
    
    # Main program starts here   
    if __name__ =='__main__':
       begueradj = Pmw.initialise(fontScheme = 'pmw1')
       begueradj.title('Billal BEGUERADJ')
       d = Begueradj(begueradj)
       begueradj.mainloop()