鱼C论坛

 找回密码
 立即注册
查看: 2834|回复: 6

[已解决]tkinter.StringVar().get()一直是空值

[复制链接]
发表于 2020-6-29 09:38:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
b文件定义一个下拉框,选中下拉框调用func函数
import tkinter as tk
from tkinter import ttk


class Test:
    def __init__(self):
        self.lst = ['a', 'b']
        self.screen = tk.Tk()

        self.var = tk.StringVar()
        self.combobox = ttk.Combobox(self.screen, textvariable=self.var, value=self.lst)
        self.combobox.pack()
        self.combobox.current(0)
        self.combobox.bind("<<ComboboxSelected>>", self.func)

        self.screen.mainloop()

    def func(self, event):
        print(self.var.get())


if __name__ == '__main__':
    Test()
b文件自测能正常获取var的值

a文件通过按钮打开b文件的下拉框
import b
import tkinter as tk


def fun():
    b.Test()

if __name__ == '__main__':
    screen = tk.Tk()

    tk.Button(screen, text="测试", command=fun).pack()

    screen.mainloop()
选中下拉框时,获取到的var的值都是空值‘’

为什么var获取不到lst列表的值呢,求解
最佳答案
2020-6-29 09:54:26
[b]

应该是变量的作用域问题,你改成这样即可
import tkinter as tk
from tkinter import ttk


class Test:
    def __init__(self):
        self.lst = ['a', 'b']
        self.screen = tk.Tk()

        self.var = tk.StringVar()
        self.combobox = ttk.Combobox(self.screen, textvariable=self.var, value=self.lst)
        self.combobox.pack()
        self.combobox.current(0)
        self.combobox.bind("<<ComboboxSelected>>", self.func)

        self.screen.mainloop()

    def func(self, event):
        print(self.combobox.get())

if __name__ == '__main__':
    Test()
[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-29 09:54:26 | 显示全部楼层    本楼为最佳答案   
[b]

应该是变量的作用域问题,你改成这样即可
import tkinter as tk
from tkinter import ttk


class Test:
    def __init__(self):
        self.lst = ['a', 'b']
        self.screen = tk.Tk()

        self.var = tk.StringVar()
        self.combobox = ttk.Combobox(self.screen, textvariable=self.var, value=self.lst)
        self.combobox.pack()
        self.combobox.current(0)
        self.combobox.bind("<<ComboboxSelected>>", self.func)

        self.screen.mainloop()

    def func(self, event):
        print(self.combobox.get())

if __name__ == '__main__':
    Test()
[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 10:03:32 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-29 10:17:09 | 显示全部楼层
Twilight6 发表于 2020-6-29 09:54
应该是变量的作用域问题,你改成这样即可

谢谢大佬

self.var 跟 self.combobox 不应该是绑定在一起的吗,具体是有什么不同呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 10:57:09 | 显示全部楼层
隐形胶佬 发表于 2020-6-29 10:17
谢谢大佬

self.var 跟 self.combobox 不应该是绑定在一起的吗,具体是有什么不同呢

我暂时也没搞明白 我研究研究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 11:27:15 | 显示全部楼层
隐形胶佬 发表于 2020-6-29 10:17
谢谢大佬

self.var 跟 self.combobox 不应该是绑定在一起的吗,具体是有什么不同呢

import tkinter as tk
from tkinter import ttk


class Test:
    def __init__(self):
        self.lst = ['a', 'b']
        self.screen = tk.Toplevel()  # 你是 Tk() 重新创建了个根窗口,导致你 b 代码那打印的是空 ,改成 Toplevel 顶层窗口即可

        self.var = tk.StringVar()
        self.combobox = ttk.Combobox(self.screen, textvariable=self.var, value=self.lst)
        self.combobox.pack()
        self.combobox.current(0)
        self.combobox.bind("<<ComboboxSelected>>", self.func)

        # self.screen.mainloop()  这个可以不要,因为你主程序有了这个,一个程序只需要一个mainloop 多余的是没意义的

    def func(self, event):
        print(self.var.get())

if __name__ == '__main__':
    Test()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 15:11:17 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 07:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表