gpt4 book ai didi

Python/Tkinter : why does the . IntVar 的 get 方法在单击不同的单选按钮时显示相同的值?

转载 作者:太空宇宙 更新时间:2023-11-03 16:44:03 29 4
gpt4 key购买 nike

该计划的简要概述:

  1. 启动脚本时,会出现对话框并要求您选择目录路径(类 MyApp )
  2. 选择后 - 需要按下“开始监控”按钮。此操作撤回主窗口 ( root ) 并初始化容器类 FrameContainer由两个帧组成,即PageOnePageTwo (参见相应的类(class))。
  3. 按钮Back HomePage One应该销毁类的实例 FrameContainer并再次显示对话框窗口。此操作是使用方法 update() 实现的和deiconify() .
  4. 选择 Page One 上的任意单选按钮应该改变变量 rb_indx 的值- 这是使用 get() 实现的方法IntVar
<小时/>

问题:

  • 单选按钮的初始化方式错误。 var.set(1)应该突出显示“var1”按钮,但在我的例子中突出显示 var2var3 .
  • get()方法IntVar不更新变量 rb_indx 的值选择单选按钮时。 print rb_indx总是给出 1
  • 关闭时PageOne按 [x](在屏幕一角)的窗口,对话框窗口没有出现,但是是预期的...
<小时/>

代码:

# -*- coding: utf-8 -*-

try:
# Python2
import Tkinter as Tk
from Tkinter import IntVar
from tkFileDialog import askdirectory

except ImportError:
# Python3
import tkinter as Tk
from tkinter import IntVar
from tkinter.filedialog import askdirectory

LARGE_FONT=("Verdana", 12)

########################################################################

class FrameContainer(Tk.Tk):

def __init__(self, parent):

self.original_frame = parent

Tk.Tk.__init__ (self)
container = Tk.Frame(self)

container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight =1)

self.frames = {}

for F in (PageOne, PageTwo):

frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")

self.show_frame(PageOne)

def show_frame (self, cont):

frame=self.frames[cont]
frame.tkraise()

def onClose(self):

self.destroy()
self.original_frame.show()

class PageOne(Tk.Frame):

def __init__(self, parent, controller):

Tk.Frame.__init__(self, parent)

label = Tk.Label(self, text="Page One", font=LARGE_FONT)
label.pack(pady=10, padx=10)

button1=Tk.Button(self, text="Back to Home", command=lambda: controller.onClose())
button1.pack()

button2=Tk.Button(self, text="Page Two", command=lambda: controller.show_frame(PageTwo))
button2.pack()

def get_button_indx():

global rb_indx
rb_indx=var.get()
print rb_indx

var.set(1)

names_tuple = ('var1', 'var2', 'var3')

for col_numb in range (1,len(names_tuple)+1):
radio = Tk.Radiobutton(self, text=names_tuple[col_numb-1], variable=var, value=col_numb, command=get_button_indx)
radio.pack()

class PageTwo(Tk.Frame):

def __init__(self, parent, controller):

Tk.Frame.__init__(self, parent)

label = Tk.Label(self, text="Page Two", font=LARGE_FONT)
label.pack(pady=10, padx=10)

button1=Tk.Button(self, text="Back to Home", command=lambda: controller.onClose())
button1.pack()

button2=Tk.Button(self, text="Page One", command=lambda: controller.show_frame(PageOne))
button2.pack()

class MyApp(object):

def __init__(self, parent):

self.root = parent
self.root.title("Start page")
self.frame = Tk.Frame(parent)
self.frame.pack()

def choosedir():

global path_usr_var
path_usr_var = askdirectory()
print path_usr_var

button1 = Tk.Button(self.frame, text="Select Directory", command=choosedir)
button1.pack(pady=10, padx=10)

button2 = Tk.Button(self.frame, text="Start Monitoring", command=self.openFrame)
button2.pack(pady=10, padx=10)

def hide(self):
self.root.withdraw()

def openFrame(self):
self.hide()
firstFrame = FrameContainer(self)

def show(self):
self.root.update()
self.root.deiconify()

########################################################################

if __name__ == "__main__":

root = Tk.Tk()
root.geometry("800x600")
var = IntVar()
app = MyApp(root)
root.mainloop()

最佳答案

问题在于您正在创建多个 Tk 实例。应用程序必须恰好有一个 Tk 实例。发生的情况是 var 属于第一个实例,但您将其与属于第二个实例的单选按钮相关联.

如果您需要多个窗口,请创建一个根窗口,然后为所有其他窗口创建 Toplevel 实例。

关于Python/Tkinter : why does the . IntVar 的 get 方法在单击不同的单选按钮时显示相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36505830/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com