0

请帮忙!我正在使用 Spyder IDE 在 Python 中编写程序。我正在使用 tkinter。我的程序包含多个 Scale 小部件,这些小部件一直按我的意愿正常工作且独立。然而,两个尺度现在似乎相互依赖,因为它们的var参数(它们是单独的变量)被初始化为相同的值。

我做了一个简化的 tkinter 程序来说明这个问题。此代码旨在模仿我的实际项目的结构 - 因此它可能看起来不像它可以的那样高效。制作了两个单独的比例尺,带有单独的变量和单独的更新命令。当两个全局变量都被初始化为相同的值时,刻度相互依赖,并且在只操作一个时都移动。当两个全局变量被初始化为不同的值时,比例可以正常工作并且符合预期。

为什么会这样?我需要我的实际项目中的两个全局变量是相同的值。我怎样才能使这项工作?

这是代码:

import tkinter as tk
from tkinter import ttk

global firstvalue
global secondvalue

firstvalue = 1000
secondvalue = 1000

class ScaleTest(tk.Tk):

    def __init__(self, *args, **kwargs):

        # Creates tkinter window and container for frames
        tk.Tk.__init__(self, *args, **kwargs)  
        tk.Tk.wm_title(self, "Scale Test")     
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        # Add ScaleTestFrame frame to container and show the frame
        self.frames = {}
        frame = ScaleTestFrame(container, self)
        self.frames[ScaleTestFrame] = frame
        frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(ScaleTestFrame)

    # Method to show the input frame.
    def show_frame(self, cont):
        self.deiconify() # Show main tkinter window
        frame = self.frames[cont]
        frame.tkraise()

# Class that defines the frame to display the algorithm creation parameters.
class ScaleTestFrame(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        MakeFirstScale(self)
        MakeSecondScale(self)

# Methods for scales
def FirstScaleUpdate(event):
    global firstvalue
    firstvalue = int(float(event))  

def MakeFirstScale(self):    
    self.first_scale = tk.Scale(self, from_=0, to=5000, resolution = 10, var = firstvalue, orient=tk.HORIZONTAL, length = 360, label = "First Scale", command = FirstScaleUpdate)
    self.first_scale.grid(row = 1, rowspan = 2, column=0, columnspan=10, sticky='wes', padx = 10, pady = (0,10))
    self.first_scale.set(1000)

def SecondScaleUpdate(event):
    global secondvalue
    secondvalue = int(float(event))  

def MakeSecondScale(self):    
    self.second_scale = tk.Scale(self, from_=0, to=2000, resolution = 10, var = secondvalue, orient=tk.HORIZONTAL, label = "Second Scale", command = SecondScaleUpdate)
    self.second_scale.grid(row = 3, rowspan = 2, column=0, columnspan=4, sticky='wes', padx = 10, pady = (0,10))
    self.second_scale.set(1000)

app = ScaleTest()
app.resizable(0,0)
app.mainloop()
4

0 回答 0