【问题标题】:How do I update the global integer variable locally? [duplicate]如何在本地更新全局整数变量? [复制]
【发布时间】:2017-06-11 08:56:34
【问题描述】:

每个人。

首先,我不确定这个问题是否得到了适当的表扬,但我已尽我所能。另外,请注意,我刚开始学习 Python 是因为我想创建一个我想使用的简单计算机程序。我想在这里问问题,因为我遇到了一个对专业人士来说似乎很容易但我似乎无法找出解决方案的问题。

这是我写的代码...

from tkinter import *
from tkinter import ttk
from PIL import Image, ImageTk

class Application(Frame):
    def __init__(self, master):
        ttk.Frame.__init__(self, master)

        self.grid()
        self.create_widgets()
        self.FIDSIA_Amount()

    def create_widgets(self):
        self.label1 = Label(self, text='Type').grid(row=1, column=12, sticky=E)

        self.Type = ttk.Combobox(self, width=7, textvariable=varSymbol, state="readonly")
        self.Type['values'] = ('--------', 'A','B','C')
        self.Type.grid(row=1, column=13)
        self.Type.bind("<<ComboboxSelected>>", self.adjustmentFIDSIA_Planet1)

    def adjustmentFIDSIA_Planet1(self, event):
        content = self.Type.get()

        if content == 'A':
            varP1f = 0
            varP1ind = 12
            varP1d = 1
            varP1s = 0
            varP1inf = 0
            varP1app = -15
        elif content == 'B':
            varP1f = 0
            varP1ind = 12
            varP1d = 1
            varP1s = 0
            varP1inf = 0
            varP1app = -10
        elif content == 'C':
            varP1f = 0
            varP1ind = 12
            varP1d = 1
            varP1s = 0
            varP1inf = 0
            varP1app = -5
        elif content == '--------':
            varP1f = 0
            varP1ind = 0
            varP1d = 0
            varP1s = 0
            varP1inf = 0
            varP1app = 0

    def FIDSIA_Amount(self):
        amountf = Label(self, textvariable=varP1F)
        amountf.grid(row=1, column=1)
        amountind = Label(self, textvariable=varP1Ind)
        amountind.grid(row=1, column=3)
        amountd = Label(self, textvariable=varP1D)
        amountd.grid(row=1, column=5)
        amounts = Label(self, textvariable=varP1S)
        amounts.grid(row=1, column=7)
        amountinf = Label(self, textvariable=varP1Inf)
        amountinf.grid(row=1, column=9)
        amountapp = Label(self, textvariable=varP1App)
        amountapp.grid(row=1, column=11)

root = Tk()

varP1f = IntVar(root)
varP1ind = IntVar(root)
varP1d = IntVar(root)
varP1s = IntVar(root)
varP1inf = IntVar(root)
varP1app = IntVar(root)

varSymbol = StringVar(root, value='--------')
varP1F = StringVar(root)
varP1F.set(str(0+varP1f.get()))
varP1Ind = StringVar(root)
varP1Ind.set(str(0+varP1ind.get()))
varP1D = StringVar(root)
varP1D.set(str(0+varP1d.get()))
varP1S = StringVar(root)
varP1S.set(str(0+varP1s.get()))
varP1Inf = StringVar(root)
varP1Inf.set(str(0+varP1inf.get()))
varP1App = StringVar(root)
varP1App.set(str(0+varP1app.get()))

app = Application(root)

root.mainloop()

所以,基本上,我创建了一个包含 6 个数字的窗口,在它旁边有一个组合框下拉菜单,列出了 4 个项目(--------、A、B、C)。我想要做的是当在组合框中选择 -------- 时,我希望 6 位数字为 0。但是,如果我在组合框中选择 A,我希望通过添加在窗口中更新 6 位数字6 个变量中的每一个都在 0 上。因此,当我选择 A 时,它看起来像“0 12 1 0 0 -15”而不是“0 0 0 0 0 0”。使用当前代码,我似乎无法做到。 PyCharm 显示 6 个变量:varP1f 等...有错误 -> 未使用局部变量值。

我该如何解决这个问题?

【问题讨论】:

  • 总是提出问题 FULL 错误消息 - 还有其他有用的信息。
  • 你的意思是self.varP1f?
  • @juanpa.arrivillaga - 该副本通常是适用的,但在这种情况下它不是,因为这些是应该被变异的 IntVar 对象,而不是要重新分配的整数。
  • @Natecat 不,我的意思是 varP1f。我想。我不确定 self 做了什么。我一直在关注 youtube 教程,但没有很好地解释。
  • @furas - 当我运行时,Shell 上没有显示错误消息。只是 6 位数字没有变成想要的数字,仍然是全 0。但是对于以后的问题,我会发布错误。谢谢你的建议。

标签: python python-3.x variables tkinter scope


【解决方案1】:

当您使用tkinter.IntVar 对象时,您应该使用它们的set 方法来设置它们,而不是通过重新分配,因为像x = tkinter.IntVar(); x = 3 这样的东西会使x 成为一个常规整数,而不再是IntVar。

像这样替换所有行:

if content == 'A':
    varP1f = 0
    varP1ind = 12
    varP1d = 1

有了这个:

if content == 'A':
    varP1f.set(0)
    varP1ind.set(12)
    varP1d.set(1)

【讨论】:

  • 感谢您的回复。我会记得让变量更具描述性和独特性。另外,我尝试了您的解决方案,但是当我从组合框中选择 A 时,Shell 向我抛出此错误“UnboundLocalError: local variable 'varP1ind' referenced before assignment”。
  • @JasonM 在函数中你必须使用global varP1f 等来通知函数你想使用外部/全局变量。或者将所有这些变量放在带有self. 的类中,而你总是使用self. 顺便说一句:你也可以使用IntVar 和Label,所以你不需要StringVar。
  • @furas - 我对包含 TigerhawkT3 的解决方案进行了一些重新安排,最终实现了它。另外,我会注意您的评论。
  • @JasonM 顺便说一句:pastebin.com/uAr8rPV2
猜你喜欢
  • 2022-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多