python - 全局变量和附加用于其他顶级函数

标签 python python-3.x tkinter

我正在尝试为一个执行一些数学运算的小程序创建一个“管理”部分。

主 TK 窗口上的管理按钮创建一个带有输入字段的顶级窗口,只有在密码字段中输入正确的密码时(或者至少当我弄清楚如何执行此操作时才会打开)。 )

提交按钮的目的是更新价格的全局变量,然后程序会从输入字段中记住该变量,该输入字段将由用户输入新的价格。我遇到的问题是如何在按下此按钮后更新和更改全局变量并保持更改。

这段代码只是为了测试执行此操作的能力而设计的,但出于上下文考虑,我无论如何都会将其发布在这里。任何对实现这一目标的帮助都将是非常棒的。

问题是这段代码不起作用,它不允许我更改全局变量,并产生错误:变量 int 没有属性附加?

此外 - 所以追加是错误的举动,公平地说,我遇到的问题是 global12mmprice = 200 没有更新全局变量,并且在程序中的其他点它仍然引用原始值。有没有办法彻底更新全局变量,让程序反射(reflect)新值,旧值不复存在?

global12mmprice = 86.67
global15mmprice = 191.19
int12mmprice = int(global12mmprice)
int15mmprice = int(global15mmprice)


class mainwindow(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        b1 = tk.Button(self, text="Glass Table", command = self.glsqWindow)
        b1.grid(column=1,row=2,pady=50,padx=10)
        self.count = 0
        b2 = tk.Button(self, text='Round Table', command = self.glrnWindow)
        b2.grid(column=2,row=2,pady=50,padx=10)
        self.count = 0
        b3 = tk.Button(self, text='Console Table', command = self.glcnWindow)
        b3.grid(column=3,row=2,pady=50,padx=10)
        self.count = 0
        b4 = tk.Button(self, text='Admin', command = self.admin)
        b4.grid(column=4,row=2,pady=50,padx=10)
        self.count = 0


    def admin(self):       
        self.count += 1
        window = tk.Toplevel(self)
        window.geometry("600x350+300+300")

        def submit():
            int12mmprice.append(200)


        b1 = tk.Button(window,text='Submit', command=submit)
        b1.grid(column=3,row=2,pady=50,padx=10)

此后还有很多代码,但这是相关部分。当然,我们也欢迎您提出任何一般性建议。

答案:- 得到了“fdhsdrg”的大量帮助。这是我实现的解决方案,以便为将来有此问题的任何人获得所需的结果。

正如向我解释的那样,我需要创建一个程序可以读取和写入的文件,该文件将为程序创建必要的信息,以便程序在需要时访问和更改。

import tkinter as tk
from tkinter import *
from tkinter import Tk, Frame, Menu
import tkinter.messagebox as box
import pickle, os

file=open('prices.dat','rb')
data=pickle.load(file)
file.close
global12mmprice = data[0]
global15mmprice = data[1]

class mainwindow(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        b1 = tk.Button(self, text="Glass Table", command = self.glsqWindow)
        b1.grid(column=1,row=2,pady=50,padx=10)
        self.count = 0
        b2 = tk.Button(self, text='Round Table', command = self.glrnWindow)
        b2.grid(column=2,row=2,pady=50,padx=10)
        self.count = 0
        b3 = tk.Button(self, text='Console Table', command = self.glcnWindow)
        b3.grid(column=3,row=2,pady=50,padx=10)
        self.count = 0
        b4 = tk.Button(self, text='Admin', command = self.admin)
        b4.grid(column=4,row=2,pady=50,padx=10)
        self.count = 0


    def admin(self):       
        self.count += 1
        window = tk.Toplevel(self)
        window.geometry("600x350+300+300")



        def submit():
            global data
            data[0] = '86.67'
            file=open('prices.dat','wb')
            pickle.dump(data,file)
            file.close        
            global root
            box.showinfo('Administration','The program will now terminate and the prices                   will be updated.')
            root.destroy()
        b1 = tk.Button(window,text='Submit', command=submit)
        b1.grid(column=3,row=2,pady=50,padx=10)

正如您所看到的 .dat 文件中的数据列表已更新,稍后我将用 get.entry() 字段替换它,但现在这演示了预期的设计。如果您希望程序在关闭后自动重新启动,您可能需要考虑使用 Resetboard 而不是 destroy。

最佳答案

嗯,您添加的错误消息几乎解释了一切。 int12mmprice是一个Integer,没有append方法。 Append 是一种可用于 List 类型的对象的方法:

>>> a=9
>>> type(a)
<type 'int'>
>>> a.append(15)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    a.append(15)
AttributeError: 'int' object has no attribute 'append'

>>> a=[9]
>>> type(a)
<type 'list'>
>>> a.append(15)
>>> a
[9, 15]

编辑:

对了,现在是范围问题。要编辑全局 int12mmprice,请将 global int12mmprice 放在 submit 函数的开头。这可以确保 submit 不会在其自己的函数范围内查看 int12mmprice,而是在全局范围内查看。

关于python - 全局变量和附加用于其他顶级函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25360371/

相关文章:

python - 为什么 __init__ 显然是可选的?

python - 如何从用户输入的框中取出字符串? Tkinter Python

python - 如何在 Tkinter 中添加占位符

python - 使用 Pandas 中的方法和逻辑分组来填充缺失值

python - Numpy 数组条件运算掩码?

当使用 staticmethod 或 classmethod 装饰器装饰时,类中的 Python LRU 缓存忽略 maxsize 限制

python - tkinter 返回动态复选框的名称

python - 在 Mac 上修复 Python

python - 无效的 block 标记 : 'bootstrap_icon' , 预期 'endblock'

python - 根据条件迭代求和列