首页 > 解决方案 > 缺少参数/在 macOS Big Sur 上打开 GUI 程序时出现问题

问题描述

这是我的第一个 GUI 程序,我遇到了一些重大问题。我真的需要一些帮助。首先,我无法在我的计算机(mac)上打开程序。在空闲 IDE 中运行时,我收到此错误消息:import Tkinter ModuleNotFoundError: No module named 'Tkinter'。

我安装了 3.9,我认为它有一个 GUI 界面。

在 VS Code 中调试时,我在第 44 行收到此错误消息:发生异常:TypeError init () 至少需要 4 个参数(给定 3 个)

我想我有 4

我不知道从哪里开始处理这些问题。根据我的研究,似乎在更新高于 11.1 的 Mac 上运行 GUI 程序存在问题。

代码如下

# Create a Tkinter GUI program that converts Celsius Temp to Fahrenheit
# F == Fahrenheit
# C == Celsius
# Tkinter imported
import Tkinter

# Global variable used
temp_val = 'Celsius'

#Set value for drop down menu 
def store_temp (set_temp):
    global temp_val
    temp_Val = set_temp

class TemperatureConverter:
    def __init__(self):
    
    # create main window
      self.main_window = Tkinter.Tk()

    # create a title for window
      self.main_window.title('Temperature Converter')

    # create three frames
      self.top_frame = Tkinter.Frame()
      self.option_frame = Tkinter.Frame()
      self.mid_frame = Tkinter.Frame()
      self.bottom_frame = Tkinter.Frame()

    #create widget for top frame
      self.prompt_label = Tkinter.Label(self.top_frame, text= 'Enter a temperature in Celsius: ')

    #pack top frame
      self.prompt_label.pack(side='left') 

    # create  str variable obj to hold empty string variable
      self.inputNumber = Tkinter.StringVar()
      self.var = Tkinter.StringVar()   

    # create widget for option drop down menu  
      self.entry = Tkinter.Entry(self.option_frame, textvariable=self.inputNumber )
      self.dropDownList = ['Celsius','Fahrenheit']
      self.drop_down = Tkinter.OptionMenu(self.option_frame, value=self.var , values=self.dropDownList, command=store_temp)
      self.var.set(dropDownList[0])

    # option widgets packed
      self.entry.pack(side='right')
      self.dropDownList.pack(side='left')

    #create widget for middle frame   
      self.result_label = Tkinter.Label(self.mid_frame) 

    # create widgets for bottom frame
      self.call_convert = (call_convert , result_label, inputNumber)

      self.convert_button = Tkinter.Button(self.bottom_frame, text='Convert', command=self.call_convert)

      self.quit_button= Tkinter.Button(self.bottom_frame, text= 'Quit', command= self.main_window.destroy)

    #pack the buttons
      self.convert_button.pack(side='left')
      self.quit_button.pack(side='left')

    #pack the frames
      self.top_frame.pack()
      self.option_frame.pack()
      self.mid_frame.pack()
      self.bottom_frame.pack()

    #Enter the tkinter main loop
      Tkinter.mainloop()

    # convert method is callback fucntion for convert button
      def call_convert(self):
          if temp_Val == 'Celsius':

              f = float((float(temp)* 9/5)+32)
              self.result_label.config(text='The temperature in Fahrenhiet is:')

          if temp_Val == 'Fahrenheit':

              c = float((float(temp)-32) * 5 / 9)
              self.result_label.config(text='The temperature in Celsius is:')



if __name__ == '__main__':
    temp_converter = TemperatureConverter()

标签: python-3.xmacosuser-interfacetkinter

解决方案


您的代码中有很多错误。我把它们都修好了(我想)。我不得不猜测你想把结果标签放在哪里。我还必须修复所有的缩进。这是工作代码:

# Create a tkinter GUI program that converts Celsius Temp to Fahrenheit
# F == Fahrenheit
# C == Celsius
# tkinter imported
import tkinter

class TemperatureConverter:
    def __init__(self):
        # create main window
        self.main_window = tkinter.Tk()

        # create a title for window
        self.main_window.title("Temperature Converter")

        # create three frames
        self.top_frame = tkinter.Frame(self.main_window)
        self.option_frame = tkinter.Frame(self.main_window)
        self.mid_frame = tkinter.Frame(self.main_window)
        self.bottom_frame = tkinter.Frame(self.main_window)

        # create widget for top frame
        self.prompt_label = tkinter.Label(self.top_frame, text="Enter a temperature in Celsius:")

        # pack top frame
        self.prompt_label.pack(side="left")

        # create str variable obj to hold empty string variable
        self.inputNumber = tkinter.StringVar(self.main_window)
        self.var = tkinter.StringVar()   

        # create widget for option drop down menu  
        self.entry = tkinter.Entry(self.option_frame, textvariable=self.inputNumber)
        self.dropDownList = ["Celsius", "Fahrenheit"]
        self.drop_down = tkinter.OptionMenu(self.option_frame, self.var, *self.dropDownList)
        self.var.set(self.dropDownList[0])

        # option widgets packed
        self.entry.pack(side="right")
        self.drop_down.pack(side="left")

        # create widget for middle frame   
        self.result_label = tkinter.Label(self.mid_frame) 

        # create widgets for bottom frame
        self.convert_button = tkinter.Button(self.bottom_frame, text="Convert", command=self.call_convert)

        self.quit_button= tkinter.Button(self.bottom_frame, text= "Quit", command=self.main_window.destroy)

        # pack the buttons
        self.convert_button.pack(side="left")
        self.quit_button.pack(side="left")

        # pack the frames
        self.top_frame.pack()
        self.option_frame.pack()
        self.mid_frame.pack()
        self.bottom_frame.pack()

        # It is better to call `<tkinter.Tk>.mainloop()`
        self.main_window.mainloop()

    # convert method is callback fucntion for convert button
    def call_convert(self):
        if self.var.get() == "Celsius":
            f = float((float(self.entry.get())* 9/5)+32)
            self.result_label.config(text="The temperature in Fahrenhiet is: "+str(f))
        if self.var.get() == "Fahrenheit":
            c = float((float(self.entry.get())-32) * 5 / 9)
            self.result_label.config(text="The temperature in Celsius is: "+str(c))
        self.result_label.pack(side="bottom")



if __name__ == "__main__":
    temp_converter = TemperatureConverter()

看看我做了什么OptionMenu,看看我是如何修复你的call_convert功能的。如果您有任何具体问题,请告诉我,我会尽力回答。

顺便说一句,我认为您遇到的任何错误都不是由您的操作系统引起的。另外我建议您下次使用import tkinter as tk它会更容易编写代码。


推荐阅读