Почему я не могу открыть Tk в tkinter? - PullRequest
0 голосов
/ 20 апреля 2020

Я сам кодировал эту игру. Это игра-угадайка для 2 игроков.

from random import randint
from tkinter import *

p1 = 0 
p2 = 0
while p1 < 3 and p2 < 3:
 answer = randint(0,16)
 wrong_answer = randint(0,16)
 wrong_answer1 = randint(0,16)


 s_list =    ["apple","book","phone","sheep","ruler","pen","eraser","knife","cement","Google","file","stapler","thermometer","box","glue","yes","no"]
 hint_list = ["Fruit","Read","Technology","Animal","Measure Length","Writing","Stationary","Cut  food", "Building Material","Search Engine","Paper organizer","Binding papers together","Temperature","Storage","Attach things together","Approval","Disapproval"]
 secret_word = s_list[answer]
 hint = f'Hint:{hint_list[answer]}'
 incorrect = s_list[answer]
 incorrect1 = s_list[answer]


 master = Tk()
 master.title("2 Players Guessing Game!")
 master.geometry('700x900+90+90')

 def random1():
   global p1
   p1 += 1
   label4["text"] = "Correct! Score:",p1 ,p2

 def random2():
   global p2
   p2 += 1
   label4["text"] = "Incorrect! Score:",p1 ,p2

 def random3():
   global p2
   p2 += 1
   label4["text"] = "Correct! Score:",p1 ,p2

 def random4():
   global p1
   p1 += 1
   label4["text"] = "Incorrect! Score:",p1 ,p2

 label = Label(master, text="2 Player Guessing Game!", font  = "Arial 14")
 label2 = Label(master, text="<- P1", font = "Arial 14")
 label3 = Label(master, text="P2 ->", font = "Arial 14")
 button = Button(master, text=secret_word, font = "Arial 14", command=random1)
 button2 = Button(master, text=incorrect, font = "Arial 14", command=random2)
 button3 = Button(master, text=incorrect1, font = "Arial 14", command=random2)
 button4 = Button(master, text=secret_word, font = "Arial 14", command=random3)
 button5 = Button(master, text=incorrect, font = "Arial 14", command=random4)
 button6 = Button(master, text=incorrect1, font = "Arial 14", command=random4)
 label4 = Label(master, text=hint, font = "Arial 14")


 label.pack()
 label2.pack()
 label3.pack()
 label4.pack()
 button.pack(side=LEFT)
 button2.pack(side=LEFT)
 button3.pack(side=LEFT)
 button4.pack(side=RIGHT)
 button5.pack(side=RIGHT)
 button6.pack(side=RIGHT)



 if p1 == 3:
   label["text"] = "Player 1 won!"
   exit()
 elif p2 == 3:
   label["text"] = "Player 2 won!"
   exit()
 else:
   continue

До того, как я добавил это "продолжить", я мог правильно напечатать Tk, но не смог l oop. После добавления «продолжить», мой Tk не может даже загрузить сейчас. Почему? Пожалуйста помоги. Спасибо.

mainloop()

Причина, по которой я не использовал PyGame, заключается в том, что я хотел, чтобы моя игра была типа "Ответь первым, получи балл".

Ответы [ 4 ]

1 голос
/ 20 апреля 2020

В какой-то момент вам нужно вызвать mainl oop (), чтобы открыть окно, ваш шнур должен выглядеть примерно так:


from random import randint
from tkinter import *

p1 = 0 
p2 = 0
while p1 < 3 and p2 < 3:
 answer = randint(0,16)
 wrong_answer = randint(0,16)
 wrong_answer1 = randint(0,16)


 s_list =    ["apple","book","phone","sheep","ruler","pen","eraser","knife","cement","Google","file","stapler","thermometer","box","glue","yes","no"]
 hint_list = ["Fruit","Read","Technology","Animal","Measure Length","Writing","Stationary","Cut  food", "Building Material","Search Engine","Paper organizer","Binding papers together","Temperature","Storage","Attach things together","Approval","Disapproval"]
 secret_word = s_list[answer]
 hint = f'Hint:{hint_list[answer]}'
 incorrect = s_list[answer]
 incorrect1 = s_list[answer]


 master = Tk()
 master.title("2 Players Guessing Game!")
 master.geometry('700x900+90+90')

 def random1():
   global p1
   p1 += 1
   label4["text"] = "Correct! Score:",p1 ,p2

 def random2():
   global p2
   p2 += 1
   label4["text"] = "Incorrect! Score:",p1 ,p2

 def random3():
   global p2
   p2 += 1
   label4["text"] = "Correct! Score:",p1 ,p2

 def random4():
   global p1
   p1 += 1
   label4["text"] = "Incorrect! Score:",p1 ,p2

 label = Label(master, text="2 Player Guessing Game!", font  = "Arial 14")
 label2 = Label(master, text="<- P1", font = "Arial 14")
 label3 = Label(master, text="P2 ->", font = "Arial 14")
 button = Button(master, text=secret_word, font = "Arial 14", command=random1)
 button2 = Button(master, text=incorrect, font = "Arial 14", command=random2)
 button3 = Button(master, text=incorrect1, font = "Arial 14", command=random2)
 button4 = Button(master, text=secret_word, font = "Arial 14", command=random3)
 button5 = Button(master, text=incorrect, font = "Arial 14", command=random4)
 button6 = Button(master, text=incorrect1, font = "Arial 14", command=random4)
 label4 = Label(master, text=hint, font = "Arial 14")


 label.pack()
 label2.pack()
 label3.pack()
 label4.pack()
 button.pack(side=LEFT)
 button2.pack(side=LEFT)
 button3.pack(side=LEFT)
 button4.pack(side=RIGHT)
 button5.pack(side=RIGHT)
 button6.pack(side=RIGHT)

 master.mainloop()

Tkinter понимание mainl oop надеюсь, это поможет

1 голос
/ 20 апреля 2020

Вы пытались добавить master.mainloop() в конце и избавиться от продолжения

from random import randint
from tkinter import *

p1 = 0
p2 = 0
while p1 < 3 and p2 < 3:
 answer = randint(0,16)
 wrong_answer = randint(0,16)
 wrong_answer1 = randint(0,16)


 s_list =    ["apple","book","phone","sheep","ruler","pen","eraser","knife","cement","Google","file","stapler","thermometer","box","glue","yes","no"]
 hint_list = ["Fruit","Read","Technology","Animal","Measure Length","Writing","Stationary","Cut  food", "Building Material","Search Engine","Paper organizer","Binding papers together","Temperature","Storage","Attach things together","Approval","Disapproval"]
 secret_word = s_list[answer]
 hint = f'Hint:{hint_list[answer]}'
 incorrect = s_list[answer]
 incorrect1 = s_list[answer]


 master = Tk()
 master.title("2 Players Guessing Game!")
 master.geometry('700x900+90+90')

 def random1():
   global p1
   p1 += 1
   label4["text"] = "Correct! Score:",p1 ,p2

 def random2():
   global p2
   p2 += 1
   label4["text"] = "Incorrect! Score:",p1 ,p2

 def random3():
   global p2
   p2 += 1
   label4["text"] = "Correct! Score:",p1 ,p2

 def random4():
   global p1
   p1 += 1
   label4["text"] = "Incorrect! Score:",p1 ,p2

 label = Label(master, text="2 Player Guessing Game!", font  = "Arial 14")
 label2 = Label(master, text="<- P1", font = "Arial 14")
 label3 = Label(master, text="P2 ->", font = "Arial 14")
 button = Button(master, text=secret_word, font = "Arial 14", command=random1)
 button2 = Button(master, text=incorrect, font = "Arial 14", command=random2)
 button3 = Button(master, text=incorrect1, font = "Arial 14", command=random2)
 button4 = Button(master, text=secret_word, font = "Arial 14", command=random3)
 button5 = Button(master, text=incorrect, font = "Arial 14", command=random4)
 button6 = Button(master, text=incorrect1, font = "Arial 14", command=random4)
 label4 = Label(master, text=hint, font = "Arial 14")


 label.pack()
 label2.pack()
 label3.pack()
 label4.pack()
 button.pack(side=LEFT)
 button2.pack(side=LEFT)
 button3.pack(side=LEFT)
 button4.pack(side=RIGHT)
 button5.pack(side=RIGHT)
 button6.pack(side=RIGHT)

 if p1 == 3:
   label["text"] = "Player 1 won!"
   exit()
 elif p2 == 3:
   label["text"] = "Player 2 won!"
   exit()

 master.mainloop()

Это работает для меня.

0 голосов
/ 20 апреля 2020

Обратите внимание, что tkinter управляется событиями, и вы не должны применять к нему процедурное / последовательное программирование.

В вашем случае вам не нужен while l oop и вы должны поместить проверочный логик победителя c в функцию и вызвать его внутри этих randomX() функций:

from random import randint
from tkinter import *

p1 = 0 
p2 = 0

answer = randint(0,16)
wrong_answer = randint(0,16)
wrong_answer1 = randint(0,16)

s_list =    ["apple","book","phone","sheep","ruler","pen","eraser","knife","cement","Google","file","stapler","thermometer","box","glue","yes","no"]
hint_list = ["Fruit","Read","Technology","Animal","Measure Length","Writing","Stationary","Cut  food", "Building Material","Search Engine","Paper organizer","Binding papers together","Temperature","Storage","Attach things together","Approval","Disapproval"]
secret_word = s_list[answer]
hint = f'Hint:{hint_list[answer]}'
incorrect = s_list[answer]
incorrect1 = s_list[answer]

master = Tk()
master.title("2 Players Guessing Game!")
master.geometry('700x900+90+90')

def check_winner():
    winner = 1 if p1 == 3 else 2 if p2 == 3 else None
    if winner:
        print(f'Player {winner} won!')
        master.destroy() # end the program

def random1():
   global p1
   p1 += 1
   label4["text"] = "Correct! Score:",p1 ,p2
   check_winner()

def random2():
   global p2
   p2 += 1
   label4["text"] = "Incorrect! Score:",p1 ,p2
   check_winner()

def random3():
   global p2
   p2 += 1
   label4["text"] = "Correct! Score:",p1 ,p2
   check_winner()

def random4():
   global p1
   p1 += 1
   label4["text"] = "Incorrect! Score:",p1 ,p2
   check_winner()

label = Label(master, text="2 Player Guessing Game!", font  = "Arial 14")
label2 = Label(master, text="<- P1", font = "Arial 14")
label3 = Label(master, text="P2 ->", font = "Arial 14")
button = Button(master, text=secret_word, font = "Arial 14", command=random1)
button2 = Button(master, text=incorrect, font = "Arial 14", command=random2)
button3 = Button(master, text=incorrect1, font = "Arial 14", command=random2)
button4 = Button(master, text=secret_word, font = "Arial 14", command=random3)
button5 = Button(master, text=incorrect, font = "Arial 14", command=random4)
button6 = Button(master, text=incorrect1, font = "Arial 14", command=random4)
label4 = Label(master, text=hint, font = "Arial 14")

label.pack()
label2.pack()
label3.pack()
label4.pack()
button.pack(side=LEFT)
button2.pack(side=LEFT)
button3.pack(side=LEFT)
button4.pack(side=RIGHT)
button5.pack(side=RIGHT)
button6.pack(side=RIGHT)

master.mainloop()
0 голосов
/ 20 апреля 2020

GUI наборы инструментов, такие как tkinter, управляемые событиями . Для правильной работы mainloop должен постоянно иметь возможность обрабатывать события клавиатуры и мыши.

Таким образом, они работают совершенно иначе, чем обычные Python сценарии, которые просто запускаются сверху вниз.

tkinter программа работает в mainloop. Таким образом, перед запуском mainloop.

  • необходимо создать только три вещи.
  • Инициализировать глобальное состояние программы.
  • Определите функции, которые можно запускать из mainloop как обратные вызовы или бездействующие задачи .

Обратный вызов вызывается в ответ на активацию элемента управления (например, нажатие на кнопку).

Задание бездействия запускается системой через указанное количество миллисекунд, когда система не занята обработкой событий. Вы можете планировать бездействующие задачи с помощью метода Tk.after().

По сути, обратные вызовы и неактивные задачи являются вашей программой.

...