首页 > 解决方案 > 有人可以帮我找出代码中的错误吗?(Python 基本图形用户界面)

问题描述

我最近才开始涉足 python(只用 java 和 JS 编写过代码),并认为我会尝试制作一个简单的数字键盘 GUI。我仍然习惯缩进格式。

我已经应用了适当的缩进并修复了所有拼写错误和语法错误,但仍然收到以下错误

“回溯(最近一次通话最后):文件“/home/pi/Desktop/Lab Work/Lab 1/Number Pad test GUI.py”,第 4 行,在类 BaseWindow(tkinter.Tk):文件“/home/pi /Desktop/Lab Work/Lab 1/Number Pad test GUI.py",第 8 行,在 BaseWindow self.minsize (x,y) NameError: name 'self' is not defined"

我也将下面的代码更新为我的最新版本

import tkinter, tkinter.ttk as ttk
import random

class BaseWindow(tkinter.Tk):
    def _Change (self):
        x,y = self.winfo_width(), self.winfo_height()

    self.minsize (x, y); self.maxsize(x, y)
    #This locks window size when called

    def FgridFormatButtons (self, ButtonList, NewLineAmount = 3):
        self.Row = 0
        self.Col = 0

        for Button in ButtonList:
            Button.grid(row = self.Row, column = self.Col)

            self.Col += 1

            if self.Col == NewLineAmount:
                self.Row += 1
                self.Col = 0
                continue

class Window (BaseWindow):
    def __init__(self, **args):
        super(Window, self).__init__()

        #Main method code

        self.EntryFrame = ttk.Frame(self)
        self.PadFrame = ttk.Frame(self)

        self.EntryFrame.pack(padx = 5, pady = 5)
        self.PadFrame.pack(padx = 5, pady = 5)

        self.AllButtons = []
        self.CanWrite = true

        self.Cod = args.get("Code") or random.randrange(9999)
        self.Timer = args.get("Timer") or 2000

        print ("debug %d"% self.Code)

        for x in range (1,10):
            self.AllButtons.append(ttk.Button(self.PadFrame, width = 4, text = x, command = lambda y = x: self.Update(x)))
            self.bind(str(x), lambda CatchEvent, y = x: self.Update(y))

        self.FGridFormatButtons(self.AllButtons)

        self.ZeroButton = ttk.Button (self.PadFrame, width = 4, text = 0, command = lambda: self.Update(0))
        self.SubmitButton = ttk.Button(self.PadFrame, width = 4, text = "Ent", command = self.CheckCode)
        self.ClearButton = ttk.Button(self.PadFrame, width = 4, text = "C", command = lambda: self.Update(-1))

        self.ClearButton.grid(row = self.Row, column = 0)
        self.ZeroButton.grid(row = self.Row, column = 1)
        self.SubmitButton.grid(row = self.Row, column = 2)

        self.bind ("0", lambda CatchEvent: self.Update(0))
        self.bind("<return>", lambda CatchEvent: self.CheckCode())

        self.KeyEnter = ttk.Entry(self,EntryFrame, state ="disabled")
        self.KeyEnter.pack

        #--
        self.after (5, self._Change)
        #This will wait 5 miliseconds and then lock the window
        #If your computer takes longer than 5 miliseconds to load then kill yourself. Or alternatively, change the last value to match how long it takes

def Update (self, x):
    if self.CanWrite:
        self.KeyEnter["state"] = "normal"

        if x == 1:
            self.KeyEnter.delete(0, tkinter.END)
        else:
            self.KeyEnter.insert(tkinter.END, x)

        self.KeyEnter["state"] = 'disabled'

def CheckCode(self):
    Key = self.KeyEnter.get()

    self.Update(-1)

    if Key == str(self.Code):
        self.Update("Correct Code!")
        self.after(self.Timer, self.destroy)

    else:
        self.Update("Incorrect code")

    self.ChangeWritePerms()

    self.after(self.Timer, self.ChangeWritePerms)

def ChangeWritePerms(self):
    if self.CanWrite:
        self.CanWrite = False
    else:
        self.CanWrite = True
        self.Update(-1)


window().mainloop()


class BaseWindow(tkinter.Tk):
    def _change (self):
        x,y = self.winfo_width(), self.winfo_height()

    self.minimize (x,y)
        #This locks window size when called

    def FgridFormatButtons (self, ButtonList, NewLineAmount = 3):
        self.Row = 0
        self.Col = 0

        for Button in ButtonList:
            Button.grid(row = self.Row, column = self.Col)

            self.Col += 1

            if self.Col == NewLineAmount:
                self.Row += 1
                self.Col = 0
                continue

class Window (BaseWindow):
    def __init__(self, **args):
        super(Window, self).__init__()

        #Main method code

        self.EntryFrame = ttk.Frame(self)
        self.PadFrame = ttk.Frame(self)

        self.EntryFrame.pack(padx = 5, pady = 5)
        self.PadFrame.pack(padx = 5, pady = 5)

        self.AllButtons = []
        self.CanWrite = true

        self.Cod = args.get("Code") or random.randrange(9999)
        self.Timer = args.get("Timer") or 2000

        print ("debug %d"% self.Code)

        for x in range (1,10):
            self.AllButtons.append(ttk.Button(self.PadFrame, width = 4, text = x, command = lambda y = x: self.Update(x)))
            self.bind(str(x), lambda CatchEvent, y = x: self.Update(y))

        self.FGridFormatButtons(self.AllButtons)

        self.ZeroButton = ttk.Button (self.PadFrame, width = 4, text = 0, command = lambda: self.Update(0))
        self.SubmitButton = ttk.Button(self.PadFrame, width = 4, text = "Ent", command = self.CheckCode)
        self.ClearButton = ttk.Button(self.PadFrame, width = 4, text = "C", command = lambda: self.Update(-1))

        self.ClearButton.grid(row = self.Row, column = 0)
        self.ZeroButton.grid(row = self.Row, column = 1)
        self.SubmitButton.grid(row = self.Row, column = 2)

        self.bind ("0", lambda CatchEvent: self.Update(0))
        self.bind("<return>", lambda CatchEvent: self.CheckCode())

        self.KeyEnter = ttk.Entry(self,EntryFrame, state ="disabled")
        self.KeyEnter.pack

        #--
        self.after (5, self._Change)
        #This will wait 5 miliseconds and then lock the window
        #If your computer takes longer than 5 miliseconds to load then kill yourself. Or alternatively, change the last value to match how long it takes

def Update (self, x):
    if self.CanWrite:
        self.KeyEnter["state"] = "normal"

        if x == 1:
            self.KeyEnter.delete(0, tkinter.END)
        else:
            self.KeyEnter.insert(tkinter.END, x)

        self.KeyEnter["state"] = 'disabled'

def CheckCode(self):
    Key = self.KeyEnter.get()

    self.Update(-1)

    if Key == str(self.Code):
        self.Update("Correct Code!")
        self.after(self.Timer, self.destroy)

    else:
        self.Update("Incorrect code")

    self.ChangeWritePerms()

    self.after(self.Timer, self.ChangeWritePerms)

def ChangeWritePerms(self):
    if self.CanWrite:
        self.CanWrite = False
    else:
        self.CanWrite = True
        self.Update(-1)


window().mainloop()


标签: pythonuser-interfacetkintersyntax-error

解决方案


好像你改变了你的问题。尝试用大 T 将 tkinter.tk 更改为 tkinter.Tk。

此错误表明您忘记在 lambda 函数之前放置逗号。

"line 60 self.bind("" lambda CatchEvent: self.CheckCode()) ^SyntaxError: invalid syntax"

您是否尝试添加逗号?
检查第 5 行和第 110 行,您忘记了 end 函数参数的 def 和冒号之后的空格。
还要检查第 86 行,您在第 82 行中将 key 定义为 Key,因此您必须在第 86 行将其命名为带有大 K 的 Key。
检查第 88 行,它显示self.;after。请删除分号以避免语法错误。
您使用的文本编辑器是什么?如果您使用 vscode,它将显示带有红色下划线的错误。


推荐阅读