Variable 类 global

Variable 类

有些控件 (比如 Entry 控件, Radiobutton 控件 等) 可以通过传入特定参数直接和一个程序变量绑定, 这些参数包括: variable, textvariable, onvalue, offvalue, value.

这种绑定是双向的: 如果该变量发生改变, 与该变量绑定的控件也会随之更新.

这些 Tkinter 控制变量和一般的 Python 变量一样, 都是用来保存某个值的.
但一般的 Python 变量不能作为属性值被传递给 variable 或者 textvariable 参数. 这些参数可接受的类型仅限于 Tkinter 包中的 Variable 类的子类. 如下:

x = StringVar() # 保存一个 string 类型变量, 默认值为""
x = IntVar() # 保存一个整型变量, 默认值为0
x = DoubleVar() # 保存一个浮点型变量, 默认值为0.0
x = BooleanVar() # 保存一个布尔型变量, 返回值为 0 (代表 False) 或 1 (代表 True)

要得到其保存的变量值, 使用它的 get() 方法即可.
要设置其保存的变量值, 使用它的 set() 方法即可.

Tkinter 支持将很多 GUI 组件与变量进行双向绑定,执行这种双向绑定后编程非常方便:

  1. 如果程序改变变量的值,GUI 组件的显示内容或值会随之改变。
  2. 当 GUI 组件的内容发生改变时(比如用户输入),变量的值也会随之改变。

为了让 Tkinter 组件与变量进行双向绑定,只要为这些组件指定 variable(通常绑定组件的 value)、textvariable(通常绑定组件显示的文本)等属性的属性值即可。(属性值就是变量)

但这种双向绑定有一个限制,就是 Tkinter不允许将组件和普通变量进行绑定,只能和 tkinter 包下 Variable 类的子类进行绑定。
该类包含如下几个子类:

ShringVar():用于包装str 值的变量。
IntVar():用于包装整型值的变量。
DoubleVar():用于包装浮点值的变量。
BooleanVar():用于包装bool值的变量。

Variable 变量如果要设置保存的变量值使用 set() 方法
如果要得到其保存的变量值使用 get() 方法。

就是这样的方法使用对象去保存数据的,把对象当作变量,与组件关联也是组件的属性的属性值是对象,说白了就是普通的变量无法做到全局变量,但是对象是全局的,所以就把对象当作全局变量用来储存数据。(对象的封装)
组件与变量进行双向绑定的属性与属性值值

var1 = tk.DoubleVar()  用于包装浮点值的变量。用于组件的textvar属性
var2 = tk.StringVar()  用于包装str 值的变量。用于组件的textvariable属性
var3 = tk. IntVar()  用于包装整型值的变量。
var4 = tk. BooleanVar()  用于包装bool值的变量。

Global的用法

Global 变量名
global—将变量定义为全局变量。可以通过定义为全局变量,实现在函数内部改变变量值。
一个global语句可以同时定义多个变量
global x, y, z

在编写程序的时候,如果想为一个在函数外的变量重新赋值,并且这个变量会作用于许多函数中时,就需要告诉python这个变量的作用域是全局变量。
此时用global语句就可以变成这个任务,也就是说没有用global语句的情况下,是不能修改全局变量的。
global语句可以声明一个或多个变量为全局变量。
该声明仅在当前代码块中有效。除此之外,没办法访问全局变量
global的作用就相当于传递参数,在函数外部声明的变量,如果在函数内想要使用,就用global来声明该变量,这样就相当于把该变量传递进来了,就可以引用该变量了
就是一个普通的变量,正常在函数内无法使用,函数内的变量只能算局部变量,用global修饰之后就可以告诉电脑这个变量是全局一样的,是一个全局变量,和函数外的那个变量是同一个。

因为是python中的一个奇异现象,在模块层面定义的变量,按理就是全局变量,在整个模块任意处都可以调用的,可以在函数中当做全局变量使用
但是如果在函数中有再赋值/定义(因为python是弱类型语言,赋值语句和定义语句一样),则会产生未定义变量的错误
而如果在函数中的定义在引用前使用,那么会正常运行,但函数中的变量和模块中的定义的全局变量不为同一个

a=10
def aa():
    print(a)
    a=a+1
    print(a)
aa()


》》Traceback (most recent call last):
    File "D:/location/5.0.py", line 284, in <module>
      aa()
    File "D:/location/5.0.py", line 281, in aa
      print(a)
  UnboundLocalError: local variable 'a' referenced before assignment
a=10
def aa():
    print(a)
    print(a)
aa()


》》》》》10
         10


上一篇:Acwing 1301. C 循环 扩展欧几里得算法


下一篇:Python 3: UnboundLocalError: local variable referenced before assignment [duplicate]