2016-05-22 3 views
0

Ich habe Tkinter mit Hilfe eines Python-Buches gelernt. Allerdings ist das Python-Buch für Python 2 geschrieben und ich benutze Python 3. Das hat mehrere Fehler erzeugt, und ich konnte sie bisher mit Hilfe anderer Fragen beheben. Es ist ein grundlegendes Programm, das ein Fenster mit Knöpfen zeigt, um 3 Spiele zu spielen oder das Fenster zu zerstören. Wenn eines der ersten beiden Spiele (Stein Papier Schere und Henker) geöffnet wird, sollen sie ein Toplevel() öffnen, das verschiedene Tasten hat, mit denen Sie das Spiel spielen können. Ich habe den Grafikcode für das dritte Spiel noch nicht geschrieben. Sie spielen jedoch nicht, wegen eines Fehlers: _tkinter.TclError: unbekannte Option "-padding" , die ich online keine Details gefunden habe. Ich verstehe, dass die unbekannte Option bedeutet, dass dieses Attribut/Schlüsselwort nicht in meiner Version von tkinter und Python 3 existiert. Die Fehlerzeilen sehen wie folgt aus: rpsFrame = Rahmen (rpsWindow, padding = '3 3 12 12', Breite = 300)Python 3 Fehler mit Tkinter: _tkinter.TclError: unbekannte Option "-padding"

Falls Sie es brauchen, sind der Fehler und der Code unten. (dieser Code nicht ausgeführt, ohne zusätzlichen Code) (wenn Sie diesen Code möchte ich werde es hinzufügen, aber ich möchte diese shortish halten)

Hier ist die vollständige Fehlerzurückverfolgungs:

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" 

hier ist die Interface-Code:

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() 

hier wird der Code von 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) 

Hier ist der Henker Code:

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

Ja, es gibt keine solche "Auffüllen" -Option. Bitte beziehen Sie sich auf [hier] (http://effbot.org/tkinterbook/frame.htm) –

+0

Um dieses Problem zu duplizieren, benötigen Sie nur drei Zeilen Code; Sie müssen nicht Ihr gesamtes Programm einschließen. –

Antwort

0

Es gibt praktisch keine Unterschiede zwischen tkinter in 2.x vs 3.x, mit Ausnahme der Import-Anweisungen. Dies ist kein 2.x vs 3.x Problem. Die padding Option ist nur gültig für ttk.Frame, aber Sie verwenden tkinter.Frame. Für das Standardtkinter Frame Widget haben Sie die padx und pady Optionen.