首页 > 解决方案 > 尝试使用 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

包含相关部分的图像

谢谢 !

标签: pythontkintercheckbox

解决方案


编辑:问题是您没有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()
...

这应该让它工作,作为关闭循环的简单解决方案。但是,这不是唯一的方法,而且肯定不是最佳实践。


推荐阅读