【问题标题】:How do i call a function that requires an argument on key press? Python如何调用需要按键参数的函数? Python
【发布时间】:2021-11-26 16:40:22
【问题描述】:

我是一个初学者程序员,如果答案很明显,很抱歉。任何帮助表示赞赏。 我目前正在使用WIN.onkeypress() 调用函数,但我的scroll_draw_col 函数需要参数curr_draw_col。我知道WIN.onkeypress() 不能将参数传递给他们的函数。如何使用 curr_draw_col 作为 keypress ("f") 的参数调用 scroll_draw_col 函数?

def scroll_draw_col(curr_draw_col):
    curr_draw_col += 1


WIN.listen()
WIN.onkeypress(tri_fwd, 'Up')  # Unrelated
WIN.onkeypress(tri_bkw, 'Down')  # Unrelated

WIN.onkeypress(tri_left, 'Left')  # Unrelated
WIN.onkeypress(tri_right, 'Right')  # Unrelated

WIN.onkeypress(scroll_draw_col, 'f')  # <-----

while True:
    WIN.update()
    dra.goto(tri.xcor(), tri.ycor())  # Unrelated
    print(curr_draw_col)  # To see if curr_draw_col is being incremented by 1 

【问题讨论】:

  • 你的scroll_draw_col函数改变调用者的输入;如果我写a=3 然后scroll_draw_col(a),那么我的a 不会改变。如果你想改变一个全局变量,那么将它作为参数传入既没有必要也没有用。相反,您想使用 global 语句,以便 Python 知道您正在使用全局变量。
  • 感谢您的快速回答!
  • 由于您使用此调用来更改变量的状态,因此使用类可能是一个更好的主意。

标签: python python-turtle


【解决方案1】:

只需使用global 并完全删除参数。但是,为了将来参考,您可以使用 lambda 将参数传递给函数而不运行它:

# What you should do
def scroll_draw_col():
    global curr_draw_col
    curr_draw_col += 1


WIN.listen()
WIN.onkeypress(tri_fwd, 'Up')  # Unrelated
WIN.onkeypress(tri_bkw, 'Down')  # Unrelated

WIN.onkeypress(tri_left, 'Left')  # Unrelated
WIN.onkeypress(tri_right, 'Right')  # Unrelated

WIN.onkeypress(scroll_draw_col, 'f')  # <-----

while True:
    WIN.update()
    dra.goto(tri.xcor(), tri.ycor())  # Unrelated
    print(curr_draw_col)  # To see if curr_draw_col is being incremented by 1 

# If you wanted to pass an argument on a key press
WIN.onkeypress(lambda: function_name(argument), 'f')

【讨论】:

    【解决方案2】:

    我确信 Lecdi 的回答已经足够,但我想我可能会添加更多方法。 看起来你试图用这个函数调用做的是改变一些状态,增加一个变量。为此,我建议使用两种技术。对于您的特定用例,我会建议一门课程。

    class DrawColTrack:
        def __init__(self):
            self.col = 0
        def increment(self):
            self.col+=1
    
    
    draw_col_tracker = DrawColTrack()
    
    WIN.listen()
    WIN.onkeypress(tri_fwd, 'Up')  # Unrelated
    WIN.onkeypress(tri_bkw, 'Down')  # Unrelated
    
    WIN.onkeypress(tri_left, 'Left')  # Unrelated
    WIN.onkeypress(tri_right, 'Right')  # Unrelated
    
    WIN.onkeypress(draw_col_tracker.increment, 'f')  # <-----
    
    while True:
        WIN.update()
        dra.goto(tri.xcor(), tri.ycor())  # Unrelated
        print(draw_col_tracker.col)  # To see if curr_draw_col is being incremented by 1 
    

    我认为关于 lambda 等主题值得一提的另一种方法是创建一个闭包。

    def gen_col_incrementer(starting_value):
        def _():
           starting_value+=1
           return starting_value
        return _
    increment = gen_col_incrementer(0)
    assert 1 == increment()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      相关资源
      最近更新 更多