gpt4 book ai didi

Python - 根据按下按钮的时间将值传递回 main()

转载 作者:行者123 更新时间:2023-12-01 03:51:23 25 4
gpt4 key购买 nike

如果这是一种严重损坏的做事方式,请原谅我,但总的来说,我对开发很陌生。

我正在尝试使用 tkinter 创建一个带有多个按钮的窗口,每个按钮上都有一个玩家的名字,使用一个从 main() 调用的类。

然后我希望能够使用稍后在应用程序中按下的按钮上的名称,因此我想将其传递回 main()。因此,如果我单击 Annie 按钮,我想稍后打开一个名为“Annie 选项”的新窗口,并且我假设需要将值“Annie”传递回主函数。

我的主要代码:

<imports appear here>
def main():

players = ['Annie','Benny','Carrie','Donny']
winHome = playerWindow(root,players)
print("In main() : " + winHome.selected)

root.mainloop()


if __name__ == "__main__":
main()

我的类(class)代码:

<imports appear here>
root=Tk()

class playerWindow():

def selectPlayer(self,selname):

self.selected = selname
print("In class: " + self.selected)

def __init__(self, master, players=[]):

colours = ['red','green','orange','white','yellow','blue']
self.selected = ""

r = 0
for p in players:
randcol = random.randint(0,len(colours))-1
if colours[randcol] in ('blue','green'):
fgcol='white'
else:
fgcol='black'
playername = delplayer = p
playername = Button(root, text=playername, bg=colours[randcol], fg=fgcol, width=15, command=lambda name = playername:self.selectPlayer(name)).grid(row=r,column=0)
s = ttk.Separator(root, orient=VERTICAL)
delplayer = Button(root, text='Del', bg='grey', fg='red', width=5, command=lambda name = delplayer: print("Delete Player %s" % name)).grid(row=r,column=1)
r = r + 1

Button(root, text="New Player", fg="black", command=lambda: print("New Player Functionality"), width=15).grid(row = len(players)+3,column=0)
Button(root, text="QUIT", fg="red", command=root.destroy, width=15).grid(row = len(players)+3,column=1)

发生的情况是窗口被创建,main() 中的下一行被运行(我添加的打印语句),它是空的,显然因为 main 正在继续。当我按下按钮时,sleectPlayer 函数被调用并起作用。

不知何故,我需要将值返回到 main() 以便使用该值继续执行下一个任务,但是我似乎无法正确地构建问题以获得我需要的答案。

任何帮助将不胜感激。

我使用的是Python 3.5.1

最佳答案

您已经在访问它。我个人不喜欢返回主函数,而是建议创建一个顶级类来链接回。这应该有助于让事情变得更好。

import tkinter as tk
from tkinter import ttk
import random

class PlayerWindow():
def __init__(self, master, parent, players=[]):

self._parent = parent

colours = ['red','green','orange','white','yellow','blue']
self.selected = ""

r = 0
for p in players:
randcol = random.randint(0,len(colours))-1
if colours[randcol] in ('blue','green'):
fgcol='white'
else:
fgcol='black'
playername = delplayer = p
playername = tk.Button(master, text=playername, bg=colours[randcol], \
fg=fgcol, width=15, command=lambda name = \
playername:self.selectPlayer(name)).grid(row=r,column=0)

s = ttk.Separator(master, orient=tk.VERTICAL)

delplayer = tk.Button(master, text='Del', bg='grey', fg='red', \
width=5, command=lambda name = delplayer: \
print("Delete Player %s" % name)).grid(row=r,column=1)
r = r + 1

tk.Button(master, text="New Player", fg="black", command=lambda: \
print("New Player Functionality"), width=15).\
grid(row = len(players)+3,column=0)

tk.Button(master, text="QUIT", fg="red", command=self._parent.close,
width=15).grid(row = len(players)+3,column=1)

def selectPlayer(self, selname):
self.selected = selname
print("In class: " + self.selected)
self._parent.hello() # call hello function of top-level, links back

class MyApplication(object):
def __init__(self, master):
self._master = master
players = ['Annie','Benny','Carrie','Donny']
self._player_window = PlayerWindow(master, self, players)
print("In main() : " + self._player_window.selected)

def hello(self):
name = self._player_window.selected
print("Hello, %s" % name)

def close(self):
# any other clean-up
self._master.destroy()

def main():
root = tk.Tk()
app = MyApplication(root)
root.mainloop()

if __name__ == "__main__":
main()

关于Python - 根据按下按钮的时间将值传递回 main(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38201209/

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