2016-06-19 3 views
1

Я пытаюсь реализовать программу TicTacToe. Я являюсь абсолютным новичком в python. После просмотра многих учебников и чтения нескольких книг я понял основы Python. Я пытаюсь отобразить кнопки в кадре, но все, что я получаю, - это пустое окно.Tkinter: кнопка в рамке не видна

link for image of the resultant window

Это код, который я до сих пор:

from Tkinter import * 

class Buttons(object): 

    def __init__(self,master): 
     frame = Frame(master) 
     frame.pack() 

     self.button1= Button(frame,text="1",height=4,width=8,command=self.move) 
     self.button1.pack(side=LEFT) 

     self.button2= Button(frame,text="2",height=4,width=8,command=self.move) 
     self.button2.pack(side=LEFT) 

     self.button3= Button(frame,text="3",height=4,width=8,command=self.move) 
     self.button3.pack(side=LEFT) 


root = Tk() 
root=mainloop() 
+0

Хорошо, я понял проблему, нужно было положить b = Кнопки (корень) для ее работы. Было бы полезно, если бы объяснили, почему это требуется? Спасибо. –

+0

Хорошо, я отправлю ответ через пару минут. –

ответ

2

Вы определили свой класс Buttons, но вы не создали экземпляр этого класса, поэтому никаких кнопок не было построено. Кроме того, у вас была ошибка опечатка/синтаксис:

root=mainloop() 

должен быть

root.mainloop() 

Кроме того, вы не определили метод move обратного вызова.

Вот исправленный вариант кода:

from Tkinter import * 

class Buttons(object): 

    def __init__(self,master): 
     frame = Frame(master) 
     frame.pack() 

     self.button1 = Button(frame, text="1", height=4, width=8, command=self.move) 
     self.button1.pack(side=LEFT) 

     self.button2 = Button(frame, text="2", height=4, width=8, command=self.move) 
     self.button2.pack(side=LEFT) 

     self.button3 = Button(frame, text="3", height=4, width=8, command=self.move) 
     self.button3.pack(side=LEFT) 

    def move(self): 
     print "click!" 

root = Tk() 
Buttons(root) 
root.mainloop() 

Однако, это все еще имеет проблемы: Метод move не имеет возможности узнать, какая кнопка называется его. Вот один из способов исправить это. Я также изменил

from Tkinter import * 

в

import tkinter as tk 

Это не очень хорошая идея использовать «звезда» импорт. Они затрудняют чтение кода, и они загрязняют ваше пространство имен всеми именами, указанными в импортированном модуле (это 175 имен в случае Tkinter), что может привести к конфликтам имен.

import Tkinter as tk 

class Buttons(object): 

    def __init__(self,master): 
     frame = tk.Frame(master) 
     frame.pack() 

     self.buttons = [] 
     for i in range(1, 4): 
      button = tk.Button(
       frame, text=i, height=4, width=8, 
       command=lambda n=i:self.move(n) 
      ) 
      button.pack(side=tk.LEFT) 
      self.buttons.append(button) 

    def move(self, n): 
     print "click", n 

root = tk.Tk() 
Buttons(root) 
root.mainloop() 
+0

Большое вам спасибо за этот пост! Это очень полезно! –

+0

@ms: Мое удовольствие! Удачи вам в вашей программе. Вероятно, вам будет проще построить сетку tic-tac-toe с использованием метода '.grid' вместо' .pack'. –

+0

Да, я на это уже. Я уверен, что столкнулся с множеством ударов, когда я начну реализовывать игровой раздел. Надеюсь, SO поможет мне в этом: D еще раз спасибо! –

0

Хорошо проблема была мне нужно добавить переменную в конце кода. Что-то вроде b = Кнопки (root). Теперь работает.

Смежные вопросы