1. StringVar属于Tkinter下的对象。


2、StringVar的作用

在使用界面编程的时候,有些时候是需要跟踪变量的值的变化,以保证值的变更随时可以显示在界面上。由于python无法做到这一点,所以 使用了tcl的相应的对象,也就是StringVar、BooleanVar、DoubleVar、IntVar所需要起到的作用

下面是一个例子,点击button之后,listbox的可选项变成4项,多出一个java选项:


def changeItems():
print cnames.get()
tnames = 'python','TCL','ruby','java'
cnames.set(tnames)

root = Tkinter.Tk()
root.geometry('+400+200')
root.minsize(400,200)
root.title("test")

tnames = 'python','TCL','ruby'
cnames = StringVar()
cnames.set(tnames)
l = Listbox(root, listvariable = cnames,height = 10).grid()

ttk.Button(root,text = "submit",command = changeItems).grid()

root.mainloop()

3.这个例子中,给StringVar变量的赋值使用的是 Tuples类型,但是这种类型是不能进行修改的 ,这会带来了一个问题,就是变量如何被修改呢?

于是将程序进行了修改,初步赋值使用的是一个list,结果出现了。

tnames = ['python','TCL','ruby']
cnames = StringVar()
cnames.set(tnames)
l = Listbox(root, listvariable = cnames,height = 10).grid()
这段程序执行的结果,listbox中显示的list的第一个是['python',  而第二个是'TCL',  第三个是'ruby']
这个事情诡异的是,确实是分解成了三段,但是三段包含了list定义所需要的[],字符串的'',以及分割的, !

于是,将程序进行了修改,去掉了字符定义的[],见下面:

tnames = 'python','TCL','ruby'
cnames = StringVar()
cnames.set(tnames)
l = Listbox(root, listvariable = cnames,height = 10).grid()
结果,程序显示正确

到底这个事情是怎么弄的呢?将代码修改一下,打印几个东西

def changeItems():
print cnames.get()
tnames = 'python','TCL','ruby','java'
cnames.set(tnames)

root = Tkinter.Tk()
root.geometry('+400+200')
root.minsize(400,200)
root.title("test")

tnames = ['python','TCL','ruby']
print tnames.__class__
cnames = StringVar()
cnames.set(tnames)
l = Listbox(root, listvariable = cnames,height = 10).grid()

ttk.Button(root,text = "submit",command = changeItems).grid()

root.mainloop()

执行上面的代码,从控制台中输出了如下的内容:


<type 'list'>
("['python',", "'TCL',", "'ruby']")

这个说明什么呢? StringVar类型调用set函数时,先将变量转变成了tuples类型的数据 。所以, 实际上最好是调用set函数之前就直接使用Tuples类型的数据,这样或许更好点

那么怎么实现函数变量的修改呢?其实很简单了,定义一个list,然后将list转换成tuples即可。修改后的函数如下:

def changeItems():
tnames.append('java')
cnames.set(tuple(tnames))

root = Tkinter.Tk()
root.geometry('+400+200')
root.minsize(400,200)
root.title("test")

tnames = ['python','TCL','ruby']
cnames = StringVar()
cnames.set(tuple(tnames))
l = Listbox(root, listvariable = cnames,height = 10).grid()

ttk.Button(root,text = "submit",command = changeItems).grid()

root.mainloop()

1. StringVar属于Tkinter下的对象。2、StringVar的作用 在使用界面编程的时候,有些时候是需要跟踪变量的值的变化,以保证值的变更随时可以显示在界面上。由于python无法做到这一点,所以使用了tcl的相应的对象,也就是StringVar、BooleanVar、DoubleVar、IntVar所需要起到的作用 下面是一个例子,点击button... String Var 并不是python内建的对象, 而是属于 Tk inter下的对象。 在使用界面编程的时候,有些时候是需要跟踪变量的值的变化,以保证值的变更随时可以显示在界面上。由于python无法做到这一点,所以使用了tcl的相应的对象,也就是 String Var 、Boolean Var 、Double Var 、Int Var 所需要起到的作用 from tk inter import t tk def go(*args): #处理事件,*args表示可变参数 print(comboxlist.get()) #打印选中的值 win= tk inter. Tk () #构造窗体 comvalue= tk inter. String Var ()#窗体自带的文本,新建一个值 comboxlist=t tk .Combobox(win,text var iable=comvalue) #初始化 comboxlist["values"]=("1","2","3","4") comboxlist.current(
String Var Tk inter 库中用于显示字符串的变量类型。这个类型的变量可以用来在 Tk inter 的 GUI 程序中显示文本。举个例子,你可以用 String Var 来创建一个标签,并使用该变量的值来更新标签的文本内容。 下面是一个例子: from tk inter import * root = Tk () label_text = String Var () label_text.s...
1、如何引出 String Var 之前一直认为 String Var 就是类似于Java的 String 类型的对象变量,今天在想要设置 String Var 变量的值的时候,通过搜索发现 String Var 并不是python内建的对象,而是属于 Tk inter下的对象。这个引起了我的兴趣,觉得需要针对性的进行学习  2、 String Var 的作用          查询了很多资料,我
当前出现 3 处内存漏洞 : 0) 0000000000F33798 - 19($0013)字节 - 不是对象 1) 0000000000F337A8 - 18($0012)字节 - 不是对象 2) 0000000000F337B8 - 18($0012)字节 - 不是对象 解读如下: 当前出现 3 处内存漏洞 :(有三个内存块分配了,但未释放。注意这里不是指对象变量或指针变量的地址,是对象的内存区域或指针指向的内存地址) 序号 未释放内存的地址  内存大小    是否是对象?如果是列出对象的Name及class并指出对象实现的单元文件名 0) 0000000000F33798 - 19($0013)字节 - 不是对象 三、测试例子: 测试用的代码: unit Unit1; interface Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } aa:T string List; bb:tbutton; Form1: TForm1; def:pointer; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin aa:=T string List.Create; bb:=Tbutton.Create(nil); aa.Add('abcdefdafasdfasdfasdfasdf'); application.MessageBox(pchar(aa. String s[0]),'asdf',MB_OK); // aa.Free; procedure TForm1.Button2Click(Sender: TObject); p:Pointer; begin GetMem(def,10); p:=def; fillchar(p,10,$65); application.MessageBox (def,'aaa',MB_OK); // freemem(def,10); 我们先点击button1,然后退出。出现的报告如下: 当前出现 10 处内存漏洞 : 0) 0000000000F3109C - 67($0043)字节 - 不是对象 1) 0000000000F316A4 - 39($0027)字节 - 不是对象 2) 0000000000F33798 - 55($0037)字节 - (未命名): T String List (48 字节) - In Classes.pas 3) 0000000000F337CC - 518($0206)字节 - : TButton (512 字节) - In StdCtrls.pas 4) 0000000000F339D0 - 42($002A)字节 - MS Sans Serif : TFont (36 字节) - In Graphics.pas 5) 0000000000F339F8 - 38($0026)字节 - (未命名): TSizeConstraints (32 字节) - In Controls.pas 6) 0000000000F33A1C - 30($001E)字节 - (未命名): TBrush (24 字节) - In Graphics.pas 7) 0000000000F33A38 - 38($0026)字节 - 不是对象 8) 0000000000F33A5C - 38($0026)字节 - 不是对象 9) 0000000000F33A80 - 42($002A)字节 - 不是对象 把bb:=Tbutton.Create(nil);注释掉://bb:=Tbutton.Create(nil);再重新编译,然后运行,再点button1。出现的报告如下: 当前出现 3 处内存漏洞 : 0) 0000000000F33798 - 55($0037)字节 - (未命名): T String List (48 字节) - In Classes.pas 1) 0000000000F337CC - 38($0026)字节 - 不是对象 2) 0000000000F337F0 - 42($002A)字节 - 不是对象 说明了:一个对象未释放,将引起多处内存泄漏(因为一个对象可能包含多个子对象) OK,我们再来测试button2(注意,这次我们不点击button1,只点击button2 一次),产生的报告如下: 当前出现 1 处内存漏洞 : 0) 0000000000F33798 - 19($0013)字节 - 不是对象 再来一次,这次点击button2 三次: 当前出现 3 处内存漏洞 : 0) 0000000000F33798 - 19($0013)字节 - 不是对象 1) 0000000000F337A8 - 18($0012)字节 - 不是对象 2) 0000000000F337B8 - 18($0012)字节 - 不是对象 这说明:对于每一个未释放的内存,CheckMem都将记录下来!再注意上面的未释放内存的地址是紧挨着的,因此如果看到这样的报告,可以猜想为一变量,多次分配,但未释放! 四、内存泄漏测试及修复的技巧:(翻译自MemProof帮助的部分内容,翻译得不好,请大家来信指导) The following are a couple of tips that can be usefull when fixing leaks in an application : 下面的这些技巧对于修复应用程序的内存泄漏非常有用: * First just launch the app and then close it. If even this action generates leaks, fix those leaks first. Only after the main leaks are fixed, you should go into specific functionality areas of the application. *首先,运行应用程序然后马上退出。如果这样操作也产生内存泄漏,先修复这些漏洞。只有先修复这些主要的泄漏,你才能进行特定功能的测试。 * In your Delphi/C++Builder project options, remove as much forms as possible from the Auto-Create option. Create your forms dynamically. *在你的delphi/C++Builder工程选项中,尽可能地不要使用自动创建窗体,你需要时再动态创建。 * 注意在循环中创建或分配的内存的代码。如果它们未释放,可能引起大量的内存泄漏。 * Go for the biggest classes first - if you see a TMyFom <class> leaking, try to fix this one first instead of going after a tiny TFont class. Since a Form will usually contain a lot of other classes, with one shot you will have fixed a lot of contained leaks. *先修复大的类,比如你看到TMyFom 类有泄漏,先解决它的问题,然后再解决像TFont 这样的小类。一个form类经常包含多个子类。修复一个form的未释放问题,你将解决大量该form包含的子对象未释的问题。 * Go for the easy fixes first. Some leaks fixes are very easy and obvious - if you fix the easy ones first, you will keep them out of your way. *首先修复容易修复的漏洞。一些泄漏是非常容易被发现的,如果你先修复他们,你就不用老想着他们了。 附:CheckMem.pas单元 unit CheckMem; file://Add it to the first line of project uses interface procedure SnapCurrMemStatToFile(Filename: string ); implementation Windows, SysUtils, TypInfo; const MaxCount = High(Word); OldMemMgr: TMemoryManager; ObjList: array[0..MaxCount] of Pointer; FreeInList: Integer = 0; GetMemCount: Integer = 0; FreeMemCount: Integer = 0; ReallocMemCount: Integer = 0; procedure AddToList(P: Pointer); begin if FreeInList > High(ObjList) then begin MessageBox(0, '内存管理监视器指针列表溢出,请增大列表项数!', '内存管理监视器', mb_ok); Exit; ObjList[FreeInList] := P; Inc(FreeInList); procedure RemoveFromList(P: Pointer); I: Integer; begin for I := 0 to FreeInList - 1 do if ObjList[I] = P then begin Dec(FreeInList); Move(ObjList[I + 1], ObjList[I], (FreeInList - I) * SizeOf(Pointer)); Exit; procedure SnapCurrMemStatToFile(Filename: string ); const FIELD_WIDTH = 20; OutFile: TextFile; I, CurrFree, BlockSize: Integer; HeapStatus: THeapStatus; Item: TObject; ptd: PTypeData; ppi: PPropInfo; procedure Output(Text: string ; Value: integer); begin Writeln(OutFile, Text: FIELD_WIDTH, Value div 1024, ' KB(', Value, ' Byte)'); begin AssignFile(OutFile, Filename); if FileExists(Filename) then begin Append(OutFile); Writeln(OutFile); Rewrite(OutFile); CurrFree := FreeInList; HeapStatus := GetHeapStatus; { 局部堆状态 } with HeapStatus do begin Writeln(OutFile, '===== ', ExtractFileName(ParamStr(0)), ',', DateTimeToStr(Now), ' ====='); Writeln(OutFile); Output('可用地址空间 : ', TotalAddrSpace); Output('未提交部分 : ', TotalUncommitted); Output('已提交部分 : ', TotalCommitted); Output('空闲部分 : ', TotalFree); Output('已分配部分 : ', TotalAllocated); Output('全部小空闲内存块 : ', FreeSmall); Output('全部大空闲内存块 : ', FreeBig); Output('其它未用内存块 : ', Unused); Output('内存管理器消耗 : ', Overhead); Writeln(OutFile, '地址空间载入 : ': FIELD_WIDTH, TotalAllocated div (TotalAddrSpace div 100), '%'); Writeln(OutFile); Writeln(OutFile, Format('当前出现 %d 处内存漏洞 :', [GetMemCount - FreeMemCount])); for I := 0 to CurrFree - 1 do begin Write(OutFile, I: 4, ') ', IntToHex(Cardinal(ObjList[I]), 16), ' - '); BlockSize := PDWORD(DWORD(ObjList[I]) - 4)^; Write(OutFile, BlockSize: 4, '($' + IntToHex(BlockSize, 4) + ')字节', ' - '); Item := TObject(ObjList[I]); if PTypeInfo(Item.ClassInfo).Kind <> tk Class then { type info technique } write(OutFile, '不是对象') begin ptd := GetTypeData(PTypeInfo(Item.ClassInfo)); ppi := GetPropInfo(PTypeInfo(Item.ClassInfo), 'Name'); { 如果是TComponent } if ppi <> nil then begin write(OutFile, GetStrProp(Item, ppi)); write(OutFile, ' : '); write(OutFile, '(未命名): '); Write(OutFile, Item.ClassName, ' (', ptd.ClassType.InstanceSize, ' 字节) - In ', ptd.UnitName, '.pas'); except on Exception do write(OutFile, '不是对象'); writeln(OutFile); finally CloseFile(OutFile); function NewGetMem(Size: Integer): Pointer; begin Inc(GetMemCount); Result := OldMemMgr.GetMem(Size); AddToList(Result); function NewFreeMem(P: Pointer): Integer; begin Inc(FreeMemCount); Result := OldMemMgr.FreeMem(P); RemoveFromList(P); function NewReallocMem(P: Pointer; Size: Integer): Pointer; begin Inc(ReallocMemCount); Result := OldMemMgr.ReallocMem(P, Size); RemoveFromList(P); AddToList(Result); const NewMemMgr: TMemoryManager = ( GetMem: NewGetMem; FreeMem: NewFreeMem; ReallocMem: NewReallocMem); initialization GetMemoryManager(OldMemMgr); SetMemoryManager(NewMemMgr); finalization SetMemoryManager(OldMemMgr); if (GetMemCount - FreeMemCount) <> 0 then SnapCurrMemStatToFile(ExtractFileDir(ParamStr(0)) + '\CheckMemory.Log'); 关于JS删除 String 里的字符的方法,一般使用replace()方法。但是这个方法只会删除一次,如果需要将 string 里的所以字符都删除就要用到正则。 var str = "abcdaabbssaaa"; var reg = new RegExp("a","g"); var a = str.replace(reg,""); console.log(a); 这里用 new RegExp()这个方法创建正则,第一个参数“a”指定了正则表达式的模式或其他正则表达式。后一个参数是一个可选的字符串,包含属性 “g”、”i” 和 “m”,分别用于指定全局匹配、区分大小写的匹配和多行匹配。 import fs from 'node:fs' ; import tempWrite from 'temp-write' ; const filePath = tempWrite . sync ( 'unicorn' ) ; //=> '/ var /folders/_1/ tk 89k8215ts0rg0kmb096nj80000gn/T/4049f192-43e7-43b2-98d9-094e6760861b' fs . readFileSync ( filePath , 'utf8' ) ; //=> 'unicorn' tempWrite . sync ( 'unicorn' , 'pony.png' ) ; //=> '/ var /folders/_1/ tk 89k8215ts0rg
由于谷歌翻译官方API是付费版本,本着免费和开源的精神,分享一下用C#实现谷歌翻译API的代码。这个代码非常简单,主要分两块:通过WebRequest的方式请求内容;获取Get方式的请求参数(难点在于 tk 的获取)。 一、WebRequest代码 var webRequest = WebRequest.Create(url) as HttpWebRequest; webRequest.Method = GET; webRequest.CookieContainer = cookie; webRequest.Referer = referer; webRequest.Timeout = 2
基于 Python 的学生信息管理系统 - GUI 界面+文件保存,可作为课程设计。本课程设计系在下来之后,就可以正常运行,非常方便,已获得导师的好评,大家可以参考一下 本程序的GUI界面可视化是使用了python的 tk inter库(下面称thinter为 tk ) ①下面介绍如何初始化GUI界面 界面主要是使用了 tk .label 和 tk .entry(代码即注释) ②实现可视化之后,原来V1.0和V2.0版本输出(print)的提示信息和获取用户输入(input),不再适用,此时要采用 tk . String Var ().set()设置GUI界面的文本框展示信息以及 tk . String Var ().get()获取用户在GUI界面输入的文本内容 (注意此处获取到的文本内容,均为 String Var 类型而并非 String ,这是不可变数据类型),其余实现思路均类似于V2.0版本(此处以“修改学生信息”功能为例) ③展示GUI界面实现结果
` tk . String Var ()` 是一个 tk inter 模块中的构造函数,用于创建一个可变的字符串变量。这个变量可以用于 tk inter GUI 应用程序中的文本标签、文本框、按钮等控件的文本属性,以便在运行时动态地更改它们的值。它返回一个字符串变量对象,可以通过 `get()` 方法获取当前的值,通过 `set()` 方法设置新的值。例如,以下代码将创建一个新的字符串变量并将其用于一个标签控件: import tk inter as tk root = tk . Tk () var = tk . String Var () label = tk .Label(root, text var iable= var ) label.pack() var .set("Hello, World!") root.mainloop() TypeError: Cannot interpret ‘<attribute ‘dtype‘ of ‘numpy.generic‘ objects>‘ as a data type解决方法 mac异常关机后打不开psql解决方法