Python tkinter中如何在两个函数间传递SelectedBadgeStr变量
解决tkinter中跨函数传递变量的问题
你遇到的核心问题是:selectScout是通过bind绑定的回调函数,tkinter默认只会把事件对象作为参数传给它,而selectBadge的返回值没办法自动传递过去——毕竟这两个函数是在不同的用户操作下触发的(选徽章和选侦察员是两个独立的动作)。下面给你几种实用的解决方案:
方案1:使用全局变量(快速上手)
把SelectedBadgeStr定义为全局变量,这样两个函数都能访问到它的值:
# 先在全局作用域声明变量 SelectedBadgeStr = "" def selectBadge(a): global SelectedBadgeStr # 声明要使用全局变量 curItem = SelectBadgeView.focus() inter_var = SelectBadgeView.item(curItem) ListValues = inter_var['values'] print(ListValues) SelectedBadge.set("Selected Badge: "+str(ListValues[0])) SelectedBadgeStr = str(ListValues[0]) return SelectedBadgeStr def selectScout(a): print(a) global SelectedBadgeStr # 访问全局变量 if SelectedPatrol.get() == "Selected Patrol: Please Select A Patrol": tk.messagebox.showerror("ERROR","Please select a Patrol") return if SelectedBadge.get() == "Selected Badge: Please Select A Badge": tk.messagebox.showerror("ERROR", "Please select a Badge") return print(SelectedBadgeStr) return
注意:全局变量简单但容易导致代码混乱,如果你的程序规模较大,不推荐过度使用。
方案2:复用tkinter的StringVar(更贴合tkinter设计)
你已经在使用SelectedBadge这个StringVar了,其实可以直接从它里面提取徽章字符串,不需要额外的SelectedBadgeStr变量:
def selectBadge(a): curItem = SelectBadgeView.focus() inter_var = SelectBadgeView.item(curItem) ListValues = inter_var['values'] print(ListValues) SelectedBadge.set("Selected Badge: "+str(ListValues[0])) return str(ListValues[0]) def selectScout(a): print(a) if SelectedPatrol.get() == "Selected Patrol: Please Select A Patrol": tk.messagebox.showerror("ERROR","Please select a Patrol") return badge_text = SelectedBadge.get() if badge_text == "Selected Badge: Please Select A Badge": tk.messagebox.showerror("ERROR", "Please select a Badge") return # 提取实际的徽章字符串 SelectedBadgeStr = badge_text.replace("Selected Badge: ", "") print(SelectedBadgeStr) return
这种方式利用了tkinter变量的双向绑定特性,不需要额外维护变量,更简洁。
方案3:用类封装(最推荐的工程化写法)
把所有的UI组件、变量和函数都封装到一个类里,这样变量可以作为实例属性在方法之间共享,完全避免全局变量的问题:
import tkinter as tk from tkinter import messagebox, ttk class ScoutApp: def __init__(self, root): self.root = root # 初始化你的tkinter变量 self.SelectedBadge = tk.StringVar(value="Selected Badge: Please Select A Badge") self.SelectedPatrol = tk.StringVar(value="Selected Patrol: Please Select A Patrol") # 假设你的SelectBadgeView和SelectScoutView在这里初始化 self.SelectBadgeView = ttk.Treeview(root) self.SelectScoutView = ttk.Treeview(root) # 绑定事件 self.SelectBadgeView.bind('<ButtonRelease-1>', self.selectBadge) self.SelectScoutView.bind('<ButtonRelease-1>', self.selectScout) def selectBadge(self, a): curItem = self.SelectBadgeView.focus() inter_var = self.SelectBadgeView.item(curItem) ListValues = inter_var['values'] print(ListValues) self.SelectedBadge.set("Selected Badge: "+str(ListValues[0])) self.SelectedBadgeStr = str(ListValues[0]) def selectScout(self, a): print(a) if self.SelectedPatrol.get() == "Selected Patrol: Please Select A Patrol": tk.messagebox.showerror("ERROR","Please select a Patrol") return if self.SelectedBadge.get() == "Selected Badge: Please Select A Badge": tk.messagebox.showerror("ERROR", "Please select a Badge") return print(self.SelectedBadgeStr) return # 运行程序 if __name__ == "__main__": root = tk.Tk() app = ScoutApp(root) root.mainloop()
这种面向对象的写法让代码结构更清晰,变量的作用域更明确,后续扩展功能也更方便。
内容的提问来源于stack exchange,提问作者Lyra Orwell
相关产品推荐
相关产品推荐

