全局变量并附加用于其他顶级函数

时间:2014-08-18 09:43:33

标签: python python-3.x tkinter

我试图创建一个" Admin"部分执行一些数学运算。

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

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

此代码仅用于测试执行此操作的能力,但为了上下文,我将在此处发布。任何帮助实现这一目标都是非常棒的。

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

进一步 - 所以附加是错误的举动,公平地说,我遇到的问题是global12mmprice = 200没有更新globalvariable,而在程序的其他点它仍然引用原始值。有没有办法完全更新全局变量,以便程序将反映新值,旧值将不再存在?

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。

1 个答案:

答案 0 :(得分:2)

好吧,你添加的错误信息几乎解释了一切。 int12mmprice是一个Integer,它没有附加方法。 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,而是在全局范围内查看。