翟小麦 2023-01-26 19:38 采纳率: 75%
浏览 63
已结题

关于tkinter combobox取值的问题

问题遇到的现象和发生背景

我在尝试做一个计算器,其中建立了一个combobox.以下是它的代码

from tkinter import *
from tkinter.ttk import *
class WinGUI(Tk):
    def __init__(self):
        super().__init__()
        self.__win()
        self.label_frame_feature = Frame_feature(self)
        self.level = ""
    def get_level(self):
        self.level = self.label_frame_feature.select_box_level[1] #用了这个[1],麻烦帮我看一下下
        return self.level
    def set_level(self,level):
        self.level = level
    def __win(self):
        self.title("Heat Loss Calculator")
     ----snip----
class Frame_feature(LabelFrame):
    def __init__(self,parent):
        super().__init__(parent)
        self.__frame()
        self.select_box_level = self.select_box_level()
    ----snip----
    def select_box_level(self):
        self.var = StringVar()
        self.cb = Combobox(self, state="readonly",textvariable=self.var)
        self.cb['values'] = ("Ground floor","Intermediated level","Top floor")
        self.cb.place(x=10, y=40, width=150, height=24)
        return self.cb, self.cb.get()
然后我在另一个模块中调用了以上这个类,以下是event.py
rom tkinter import *
from tkinter.ttk import *
from tkinter_helper import WinGUI

class Win():
    def __init__(self,win_gui_instance):
        self.win_gui = win_gui_instance
        self.__event_bind()

    #only a pure method
    def calc_level(self):
        self.level = self.win_gui.get_level()
        if self.level == "Intermediated level":
            self.level = 0   
        elif self.level == "Ground floor":
            self.level = 1
        else:
            self.level =0.7 #这里
        return self.level

    def update_level(self,level):   
        new_level = self.calc_level()
        self.win_gui.set_level(new_level)
        return print(self.win_gui.level),

    def __event_bind(self):
        self.win_gui.button_calcNow.bind('<Button-1>',self.update_level)

root = WinGUI() 
win = Win(root)
root.mainloop()
运行结果及详细报错内容

理论上,选combobox不同的内容会有对应的值,但是现在只会返回0.7。也就是说self.win_gui.get_level() 为空,我尝试打印了该值,确认为空。请问为什么会这样呢

0.7
0.7
0.7
[Finished in 4.1s]
  • 写回答

4条回答 默认 最新

  • 阳光宅男xxb 2023-01-26 19:51
    关注

    估计你获取combbox的取值方法不对啊。

    def selection(event):
        # combobox的三种取值方法
        print(event.widget.get())
        print(combo.get())
        print(combo_var.get())
    combo = ttk.Combobox(root, values=values, textvariable=combo_var)
    combo.pack()
    combo.bind("<<ComboboxSelected>>",  selection)
    

    所以你那里要修改为
    self.level=...(select_box_level()[0]).get()

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月3日
  • 已采纳回答 1月26日
  • 创建了问题 1月26日

悬赏问题

  • ¥50 深度学习运行代码直接中断
  • ¥15 关于#单片机#的问题,请各位专家解答!
  • ¥15 关于#单片机#的问题,请各位专家解答!
  • ¥20 需要完整的共散射点成像代码
  • ¥15 编写vba代码实现数据录入工作
  • ¥15 做过TCL海信电视小米电视相关影视会员软件私我
  • ¥15 Mapreduce是正常的,在运行其他jar包时并没有任何问题,只是在做LogCount.jar 时出的问题。如图所示
  • ¥15 ImportError: DLL load failed while importing _iterative: 找不到指定的模块。
  • ¥15 如何通过交互分析得出某高危患者对放疗获益更多
  • ¥15 相关性分析中,p<0.05, r=0.29,怎么评价相关性呢