【问题标题】:Does anyone know how to combine these functions?有谁知道如何组合这些功能?
【发布时间】:2019-10-31 12:28:52
【问题描述】:

我想组合 def clicked 和 def clicked2 函数,因为它们是相同的,但我不知道该怎么做。我还没有尝试过,但我想不出办法。

from tkinter import *
import random
window = Tk()
x = round(random.random()) + 1
m = 7 
window.title("NIM-7 spel") 
window.geometry('350x200') 
lbl = Label(window, text="Player " + str(x) + " next")
lbl2 = Label(window, text="Their are " + str(m) + " coins left")
lbl.grid(column=0, row=1) 
lbl2.grid(column=1, row=0)

def clicked(): 
    global x
    global m
    m -= 1
    if m < 1:
        lol = "Player " + str(x) + " won!"
        res = ""
    else: 
        if x == 1: 
            x = 2
        else: 
            x = 1
        lol = "Their are " + str(m) + " coins left"
        res = "Player " + str(x) + " is next"
    lbl.configure(text=res) 
    lbl2.configure(text=lol)
def clicked2(): 
    global x
    global m
    m -= 2
    if m < 1: 
        lol = "Player " + str(x) + " won!"
        res = ""
    else: 
        if x == 1: 
            x = 2
        else: 
            x = 1
        lol = "Their are " + str(m) + " coins left"
        res = "Player " + str(x) + " is next"
    lbl.configure(text=res)
    lbl2.configure(text=lol)

btn1 = Button(window, text="Take 1 coin", command=clicked)
btn2 = Button(window, text="Take 2 coins", command=clicked2)
btn1.grid(column=1, row=1)
btn2.grid(column=2, row=1)
window.mainloop() 

有人知道怎么做吗?

【问题讨论】:

  • 如果它们相同,您可以删除其中一个并使用另一个。或者你的意思是他们几乎是一样的?
  • 他们不一样。一个将 m 减 1,另一个减 2。您的意思是要问如何将公共部分分解为第三个函数并从这两个函数中调用该新函数?

标签: python tkinter


【解决方案1】:

如果您使用 lambda 函数,您可以向 tkinter 按钮添加参数。 已经提出了一些相同的问题:

Functions in Tkinter

How to call a function with arguments in "Button" function from "tkinter" python package?

def clicked(value): 
    global x
    global m
    m -= value
    if m < 1:
        lol = "Player " + str(x) + " won!"
        res = ""
    else: 
        if x == 1: 
            x = 2
        else: 
            x = 1
        lol = "Their are " + str(m) + " coins left"
        res = "Player " + str(x) + " is next"
    lbl.configure(text=res) 
    lbl2.configure(text=lol)

btn1 = Button(window, text="Take 1 coin", command = lambda:clicked(1))
btn2 = Button(window, text="Take 2 coins", command = lambda:clicked(2))

【讨论】:

  • 感谢您的回答。这真的很有帮助。我是初学者,所以对我来说仍然很难。您是否还知道如何使答案中的代码尽可能短?我想学习最有效的编码方式。
【解决方案2】:

传入你想减少多少m作为参数。所以:

def clicked(decrement): 
    global x
    global m
    m -= decrement
    if m < 1: 
        lol = "Player " + str(x) + " won!"
        res = ""
    else: 
        if x == 1: 
            x = 2
        else: 
            x = 1
        lol = "Their are " + str(m) + " coins left"
        res = "Player " + str(x) + " is next"
    lbl.configure(text=res)
    lbl2.configure(text=lol)

然后这样称呼它:clicked(1)clicked(2)

因为您将它作为参数传递给Button,所以您可以创建虚拟函数:

def clicked1():
    clicked(1)

clicked2 类似。

【讨论】:

  • 谢谢伙计。我很欣赏它。我是初学者,所以对我来说仍然很难。你也知道如何让代码尽可能短吗?
猜你喜欢
  • 2020-10-04
  • 1970-01-01
  • 2021-06-03
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
相关资源
最近更新 更多