在一个函数中调用另一个函数中定义的变量,并使用按钮重置变量

2024-06-25 23:26:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我的pythongui应用程序生成并显示一些随机值。我有开始,停止和计算按钮。我有随机发生器功能。我每秒钟都在叫它。它生成一个包含两个值的列表。我附加这个列表以便得到一个列表列表。我只想在按下“停止”按钮后再次按“开始”时将此列表重置为空。方法get\u max\u list应该给出由randomGenerator生成的列表值的最大值。如何传递此列表值以获取\u max \u list(抱歉,我是python学习者)

import tkinter as tk
import random
import threading
start_status = False
calc_list=[]
rand = random.Random()

def randomGenerator():
    global calc_list
    if start_status:
        outputs = []
        Out1= rand.randrange(0,100,1)
        Out2= rand.randrange(0,100,1)
        outputs.append(Out1)
        outputs.append(Out2)

        output_1.set(Out1)  #to display in the GUI
        output_2.set(Out2)
        calc_list.append(outputs)       #i am trying to rest this to empty #when i press start after pressing stopping. 
        print(calc_list)
    win.after(1000, randomGenerator)

def start_me():
    global start_status
    start_status = True
    stopButton.config(state="normal")
    startButton.config(state="disabled")
    calcButton.config(state="disabled")
    calc_list=[]  #it doesn't work

def stop_me():
    global start_status
    start_status = False
    startButton.config(state="normal")
    stopButton.config(state="disabled")
    calcButton.config(state="normal")

def get_max_list(calc_list): #this doesn't work ?
    return [max(x) for x in zip(*calc_list)]
win = tk.Tk()
win.geometry('800x800')


output_1 = tk.StringVar()
output_2 = tk.StringVar()
output_1_label = tk.Label(win, textvariable=output_1)
output_1_label.place(x=200, y=100)

output_2_label = tk.Label(win, textvariable=output_2)
output_2_label.place(x=200, y=200)

startButton = tk.Button(win, text="Start" command = lambda:threading.Thread(target = start_me).start())
startButton.place(x=200, y=500)

stopButton = tk.Button(win, text="Stop", state=tk.DISABLED,  command= lambda:threading.Thread(target = stop_me).start())
stopButton.place(x=200, y=600)

calcButton = tk.Button(win, text="calculate", state=tk.DISABLED, command= lambda:threading.Thread(target = get_max_list).start())
calcButton.place(x=200, y=700)

win.after(1000, randomGenerator)
win.mainloop()

Tags: config列表outputdefstatuscalcplacestart
1条回答
网友
1楼 · 发布于 2024-06-25 23:26:05

对于第一个问题,如前所述,您没有为列表calc_list声明global

def start_me():
    global start_status, calc_list
    ...
    calc_list=[]

对于get_max_list函数,它需要一个参数calc_list。您需要通过修改threadlambda函数来提供列表作为参数:

calcButton = tk.Button(win, text="calculate", state=tk.DISABLED, command= lambda:threading.Thread(target = get_max_list,args=(calc_list,)).start())

或者干脆让你的函数不带arg:

def get_max_list():
    return [max(x) for x in zip(*calc_list)]

相关问题 更多 >