Почему этот случайный сборщик всегда выбирает один и тот же выбор? - PullRequest
0 голосов
/ 03 декабря 2018

Я изучаю Python, и я просто бездельничаю с тем, что я могу сделать.В качестве доказательства концепции для более крупного проекта я создал очень простой скрипт на python, который будет отображать One или Two в графическом интерфейсе, но это не работает.Случайный сборщик всегда выбирает два, а не один.Вот код:

from tkinter import*
import random

root = Tk()
root.geometry("800x500")
root.title("amazing")

def one():
     label1 = Label(root, text="one", font=("Comic Sans MS", 30),  fg="purple").place(x=100, y=300)


def two():
    label2 = Label(root, text="two", font=("Comic Sans MS", 30),  fg="purple").place(x=100, y=300)


rchoice = [two, one]
doit = random.choice(rchoice)

Button = Button(root, text="Button", width=15, height=3, font=("Comic Sans MS", 20), fg="blue", bg="lightgreen", command=doit).pack(pady=50)

root.mainloop()

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Причина, по которой ваша программа всегда запускает одну и ту же опцию при нажатии кнопки, заключается в том, что метка (one или two) выбирается при запуске программы, а не при каждом нажатии кнопки.Поэтому, когда ваша программа загружается, она выберет либо one, либо two, а затем эта кнопка всегда будет запускать выбранную метку (до перезапуска).В основном random.choice выполняется только один раз в начале, а затем устанавливается doit на время действия программы.

Чтобы это исправить, вы захотите выбрать метку при нажатии кнопки.Вы можете сделать это, переопределив doit следующим образом:

def doit():
    rchoice = [one, two]
    selected = random.choice(rchoice)
    return selected()
0 голосов
/ 03 декабря 2018

Проблема в doit не в function, а в результирующем значении random.choice(), которое называлось до вашего основного цикла .Поэтому, как только он установится на two или one, он никогда не изменится снова, когда ваша программа doit не вызывает функцию random.choice() для выбора другой.

Вам нужно будет изменитьВаш Button command аргумент вместо этого:

btn = Button(root, text="Button", width=15, height=3, font=("Comic Sans MS", 20), fg="blue", bg="lightgreen", command=lamdba: random.choice(rchoice)).pack(pady=50)

Это позволяет command выполнять функцию random.choice() каждый раз, когда вызывается Button.

Также это ужасная идея перезаписать ваши импортированные имена, такие как Button.Используйте другое имя, например btn, иначе после этой точки вы никогда не сможете создать другое Button.

Или просто не используйте импорт звездочек вообще:

import tkinter as tk
button = tk.Button(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...