python - 尝试使用 Tkinter 将复选框分配给操作时“未定义变量”
问题描述
我是 Python 或编程新手。我正在尝试将 tkinter 复选框绑定到命令但有问题。
我创建了一个应用程序,它应该根据用户输入将数据保存到 xlsx 文件。当用户选择相关选项时,它们应该被“激活”但是当我单击相关复选框时出现错误(现在将命令分配给一个只是为了检查它是否有效)。
下面是我的整个代码,在代码下面我添加了我得到的错误。我还添加了 GIU 窗口,以便您了解它的外观以及我的确切含义。
我发现一两个线程讨论这个问题,但我不认为问题的根源是相同的。我将 Python 3.9 与 Anaconda 和 Spyder 一起使用
相关代码:。
from tkinter import *
import tkinter as tk
from tkinter import filedialog
from termcolor import cprint ,colored
import pydicom
import pandas as pd
class gettingDataFromDICOM:
def DICOMData(dcmread):
pass
#Asking the user to choose input location
print('Welcome to DTETool v1.1')
def filelocainput():
global Data
filelocationinput = filedialog.askopenfilename()
Data = pydicom.dcmread(filelocationinput , force = True )
print('PatientID -',Data.PatientID)
df = pd.DataFrame ({'PatientID ': [Data.PatientID]})
class tkgui:
pass
def activate():
if Data.PatientID.get() == 1:
scale.config(state=ACTIVE)
elif Data.PatientID.get() == 0:
scale.config(state=DISABLED)
Checkboxes =Tk()
Checkboxes.geometry('400x320')
TitleSelDCM = Label(Checkboxes , text ='DICOM fields selection',fg='white')
TitleSelDCM.place(y=0 ,x=120)
CheckboxWindowbg = PhotoImage(file="C:\Tools\DTETool\SeconderyBG.png")
CheckboxWindowbg_label = Label(Checkboxes , image=CheckboxWindowbg)
CheckboxWindowbg_label.place(y=0,x=0 , relwidth =1 , relheight=1)
CheckBoxPID = IntVar()
CheckBoxPID = Checkbutton(Checkboxes , text = 'PatientID', bg = '#0B5ED8' ,fg = 'white', onvalue = 1 , offvalue = 0 , variable = CheckBoxPID ,command =activate)
CheckBoxPID.place(y=20 , x=20)
Checkboxes.mainloop()
错误 :
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Program Files\Spyder\pkgs\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "C:\Tools\DTETool\DTEToolv1.1\DTEtool.py", line 113, in activate
if Data.PatientID.get() == 1:
NameError: name 'Data' is not defined
谢谢 !
解决方案
编辑:问题是您没有Data
在本地范围内声明变量,而只是在函数范围内。另请注意,您正在函数Data
内部进行初始化,filelocainput
但您从未调用它。
根据评论中TheLizzard的回答,在函数内添加一条global Data
语句filelocainput
作为第一条语句。然后在你应该使用之前找到一个合适的地方来调用这个函数filelocainput()
Data
编辑:以下是使用的一个小工作示例global
:
def foo():
global x
x = 1
foo()
print(x)
在您的代码中,它应该类似于以下内容(跳过不相关的部分):
from tkinter import *
import tkinter as tk
from tkinter import filedialog
from termcolor import cprint ,colored
import pydicom
import pandas as pd
...
def filelocainput():
global Data
....
filelocainput()
...
这应该让它工作,作为关闭循环的简单解决方案。但是,这不是唯一的方法,而且肯定不是最佳实践。
推荐阅读
- php - PHP 表对齐在 foreach 循环中不正确
- html - 保存数据时如何生成pdf?
- python - 如何在 LDA 中查看每个主题的所有文档?
- java - 将多个休眠到同一实体之一。如何删除?
- android - Firebase-UI 中的 Firebase FirebaseRecyclerAdaptor 不返回数据
- db2 - 大型机 - 更改的文件名的扩展名后缀的名称是什么?
- php - WordPress Ajax 400 错误请求
- wordpress - 使用 WP REST API 获取自定义帖子
- php - 似乎 jQuery .load() 不起作用
- javascript - JavaScript 在 DOM 之前解析代码