2016-05-22 4 views
0

Я изучаю tkinter с помощью книги python. Тем не менее, книга python написана для python 2, и я использую python 3. Это вызвало несколько ошибок, и до сих пор я смог их исправить с помощью других вопросов. Это базовая программа, которая показывает окно с кнопками для игры в 3 игры или для уничтожения окна. Когда открываются две из первых двух игр (ножницы для каменной бумаги и палач), они должны открыть Toplevel(), который имеет различные кнопки, позволяющие вам играть в игру. Я еще не написал графический код для третьей игры. Они не играют, однако, из-за ошибки: _tkinter.TclError: неизвестная опция «-память» , о которой я не нашел ни одной информации о онлайн-сервисе. Я понимаю, что неизвестный параметр означает, что этот атрибут/ключевое слово не существует в моей версии tkinter и python 3. Линии ошибок выглядят так: rpsFrame = Frame (rpsWindow, padding = '3 3 12 12', width = 300)Ошибка Python 3 с Tkinter: _tkinter.TclError: неизвестная опция «-память»

Если вам это нужно, введите код ошибки и код ниже. (этот код не работает без дополнительного кода) (если вы хотите этот код, я добавлю его, но я хочу, чтобы это коротковатый)

Вот полная отслеживающие ошибок:

Exception in Tkinter callback 

Traceback (most recent call last): 
    File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__ 
    return self.func(*args) 
    File "E:\Python\Python Book\Graphics\Hangman.py", line 149, in gui 
    hmFrame = Frame(hmWindow, padding = "3 3 12 12", width = 300) 
    File "C:\Python34\lib\tkinter\__init__.py", line 2582, in __init__ 
    Widget.__init__(self, master, 'frame', cnf, {}, extra) 
    File "C:\Python34\lib\tkinter\__init__.py", line 2122, in __init__ 
    (widgetName, self._w) + extra + self._options(cnf)) 
_tkinter.TclError: unknown option "-padding" 

Вот код интерфейса:

from tkinter import * 
import RockPaperScissors 
import Hangman 
import PokerDice 

root = Tk() 
root.title("Linux User & Developer's Mega Games Collection") 

mainframe = Frame(root, height = 200, width = 500) 
mainframe.pack_propagate(0) 
mainframe.pack(padx = 5, pady = 5) 

intro = Label(mainframe, text = """Welcome to Linux User & Developers Mega 
Microgames Collection. 
Select one of the following games to play: 
""") 
intro.pack(side = TOP) 

rpsButton = Button(mainframe, text = "Rock, Paper, Scissors", 
        command = RockPaperScissors.gui) 
rpsButton.pack() 

hmButton = Button(mainframe, text = "Hangman", command = Hangman.gui) 
hmButton.pack() 

pdButton = Button(mainframe, text = "Poker Dice", command = PokerDice.start) 
pdButton.pack() 

exitButton = Button(mainframe, text = "Quit", command = root.destroy) 
exitButton.pack(side = BOTTOM) 

root.mainloop() 

Вот код, Rock, Paper Scissors:

from tkinter import * 

import random 

def gui(): 

    rock = 1 
    paper = 2 
    scissors = 3 

    names = { rock: "Rock", paper: "Paper", scissors: "Scissors" } 
    rules = { rock: scissors, paper: rock, scissors: paper } 

    def start(): 
     while game(): 
      pass 

    def game(): 
     player = playerChoice.get() 
     computer = random.randint(1, 3) 
     computerChoice.set(names[computer]) 
     result(player, computer) 

    def result(player, computer): 
     newScore = 0 
     if player == computer: 
      resultSet.set("Tie game.") 
     elif rules[player] == computer: 
      result.set("Your victory has been assured.") 
      newScore = playerScore.get() 
      newScore += 1 
      playerScore.set(newScore) 
     else: 
      resultSet.set("The commputer laughs as you realise you have " + 
          "been defeated.") 
      newScore = computerScore.get() 
      newScore += 1 
      computerScore.set(newScore) 

    rpsWindow = Toplevel() 
    rpsWindow.title("Rock, Paper, Scissors") 

    playerChoice = IntVar() 
    computerChoice = StringVar() 
    resultSet = StringVar() 
    playerChoice.set(1) 
    playerScore = IntVar() 
    computerScore = IntVar() 

    **rpsFrame = Frame(rpsWindow, padding = '3 3 12 12', width = 300)** 
    #this is what is causing the error 
    rpsFrame.grid(column = 0, row = 0, sticky = (N, W, E, S)) 
    rpsFrame.columnconfigure(0, weight = 1) 
    rpsFrame.rowconfigure(0, weight = 1) 

    Label(rpsFrame, text = 'Player').grid(column = 1, row = 1, sticky = W) 
    Radiobutton(rpsFrame, text = 'Rock', variable = playerChoice, 
       value = 1).grid(column = 1, row = 2, sticky = W) 
    Radiobutton(rpsFrame, text = 'Paper', variable = playerChoice, 
       value = 2).grid(column = 1, row = 2, sticky = W) 
    Radiobutton(rpsFrame, text = 'Scissors', variable = playerChoice, 
       value = 3).grid(column = 1, row = 2, sticky = W) 

    Label(rpsFrame, text = 'Computer').grid(column = 3, row = 3, sticky = W) 
    Label(rpsFrame, textvariable = computerChoice).grid(column = 1, 
                 row = 3, sticky = W) 

    Button(rpsFrame, text = "Play", command = start).grid(column = 2, row = 2) 

    Label(rpsFrame, text = "Score").grid(column = 1, row = 5, sticky = W) 
    Label(rpsFrame, textvariable = playerScore).grid(column = 1, 
                row = 6, sticky = W) 

    Label(rpsFrame, text = "Score").grid(column = 1, row = 5, sticky = W) 
    Label(rpsFrame, textvariable = computerScore).grid(column = 3, 
                 row = 6, sticky = W) 

    Label(rpsFrame, textvariable = resultSet).grid(column = 2, row = 7) 

Вот палач код:

from tkinter import * 
import random 

word = 0 
wordLength = 0 
clue = 0 

def gui(): 
    global word, wordLength, clue 
    dictionary = ["..."] 
    #I've omitted the words due to length 
    word = random.choice(dictionary) 
    wordLength = len(word) 
    clue = wordLength * ["_"] 
    tries = 6 

    def hangedman(hangman): 
     grphic = ["""..."""] 
     #I've omitted the ASCII graphics that go in the list due to length 
     graphicSet = graphic[hangman] 
     hmGraphic.set(graphicSet) 

    def game(): 
     lettersWrong = incorrectGuess.get() 
     letter = guessLetter() 
     firstIndex = word.find(letter) 
     if firstIndex == -1: 
      lettersWrong += 1 
      incorrectGuesses.set(lettersWrong) 
     else: 
      for i in range(wordLength): 
       if letter ++ word[i]: 
        clue[i] = letter 
     hangedman(lettersWrong) 
     clueSet = " ".join(clue) 
     wordOutput.set(clueSet) 
     if lettersWrong == tries: 
      resultText = "Game Over. The word was " + word 
      resultSet.set(resultText) 
      newScore = computerScore.get() 
      newScore += 1 
      computerScore.set(newScore) 
     if "".join(clue) == word: 
      resultText = "You win! The word as " + word 

    def guessLetter(): 
     letter = letterGuess.get() 
     letter = letter.strip() 
     letter = letter.lower() 
     return letter 

    def resetGame(): 
     global word, wordLength, clue 
     incorrectGuesses.set(0) 
     hangedman(0) 
     resultSet.set("") 
     letterGuess.set("") 
     word = random.choice(dictionary) 
     wordLength = len(word) 
     clue = wordLength * ["_"] 
     newClue = " ".join(clue) 
     wordOutput.set(newClue) 

    hmWindow = Toplevel() 
    hmWindow.title("Hangman") 
    incorrectGuesses = IntVar() 
    incorrectGuesses.set(0) 
    playerScore = IntVar() 
    computerScore = IntVar() 
    resultSet = StringVar() 
    letterGuess = StringVar() 
    wordOutput = StringVar() 
    hmGraphic = StringVar() 

    **hmFrame = Frame(hmWindow, padding = "3 3 12 12", width = 300)** 
    #this is what is causing the error 
    hmFrame.grid(column = 0, row = 0, stick = (N, W, E, S)) 
    hmFrame.columnconfigure(0, weight = 1) 
    hmFrame.rowconfigure(0, weight = 1) 

    Label(hmFrame, textvariable = hmGraphic).grid(column = 2, row = 1) 
    Label(hmFrame, text = "Word").grid(column = 2, row = 2) 
    Label(hmFrame, textvariable = wordOutput).grid(column = 2, row = 3) 

    Label(hmFrame, text = "Enter a letter").grid(column = 2, row = 4) 
    hmEntry = Entry(hmFrame, exportselection = 0, 
        textvariable = letterGuess).grid(column = 2, row = 5) 
    hmEntryButton = Button(hmFrame, text = "Guess", 
          command = game).grid(column = 2, row = 10) 

    Label(hmFrame, text = "Wins").grid(column = 1, row = 7, sticky = W) 
    Label(hmFrame, textvariable = playerScore).grid(column = 1, row = 8, 
                sticky = W) 
    Label(hmFrame, text = "Losses").grid(column = 3, row = 7, sticky = W) 
    Label(hmFrame, textvariable = computerScore).grid(column = 3, row = 8, 
                 sticky = W) 
    Label(hmFrame, textvariable = resultSet).grid(column = 2, row = 9) 
    replayButton = Button(hmFrame, text = "Reset", 
          command = resetGame).grid(column = 2, row = 10) 
+0

Да, такой опции «padding» нет. Пожалуйста, обратитесь к [здесь] (http://effbot.org/tkinterbook/frame.htm) –

+0

Для дублирования этой проблемы вам понадобятся только три строки кода; вам не нужно включать всю вашу программу. –

ответ

0

Там практически нет различий между Tkinter в 2.x против 3.x, за исключением операторов импорта. Это не проблема 2.x vs 3.x.

Опция padding действительна только для ttk.Frame, но вы используете tkinter.Frame. Для стандартного виджета tkinter Frame у вас есть опции padx и pady.

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