[英]How to use classes in Python (Classes are not working in my code)
我编写了一个代码,然后决定将其拆分为一个GUI类和一个逻辑类,但是现在我已经做到了在创建两个类之后该代码不起作用,它在没有这些类的情况下也可以工作,但是我试图使其工作与类。 如果有人可以解决此问题,我将非常感激。 任何帮助将不胜感激,谢谢。
from tkinter import *
import tkinter as tk
from tkinter import ttk
class GUI:
notebook = ttk.Notebook(root)
frame1 = ttk.Frame(notebook)
notebook.add(frame1, text='Length')
frame2 = ttk.Frame(notebook)
notebook.add(frame2, text='Weight')
frame3 = ttk.Frame(notebook)
notebook.add(frame3, text='Temperature')
notebook.pack(expand=1, fill="both")
#======================================================================
entry = Entry(frame1)
entry.grid(row=0, column=0)
label = Label(frame1, relief='groove', width=20, text='')
label.grid(row=0, column=3)
options1 = ['mm', 'cm', 'm', 'km', 'Inches', 'Feet', 'Yards', 'Miles']
var1 = tk.StringVar(frame1)
var1.set(options1[0])
dropdown1 = tk.OptionMenu(frame1, var1, options1[0], options1[1], options1[2], options1[3], options1[4], options1[5], options1[6], options1[7])
dropdown1.grid(row=1, column=0)
var2 = tk.StringVar(frame1)
var2.set(options1[0])
dropdown2 = tk.OptionMenu(frame1, var2, options1[0], options1[1], options1[2], options1[3], options1[4], options1[5], options1[6], options1[7])
dropdown2.grid(row=1, column=3)
equal_button = Button(frame1, text='=', command=Length_Error)
equal_button.grid(row=1, column=5)
#======================================================================
weight_entry = Entry(frame2)
weight_entry.grid(row=0, column=0)
weight_label = Label(frame2, relief='groove', width=20, text='')
weight_label.grid(row=0, column=3)
options2 = ['Grams', 'Kilograms', 'Ounces', 'Pounds', 'Tonnes']
weight_var1 = tk.StringVar(frame2)
weight_var1.set(options2[0])
dropdown1 = tk.OptionMenu(frame2, weight_var1, options2[0], options2[1], options2[2], options2[3], options2[4])
dropdown1.grid(row=1, column=0)
weight_var2 = tk.StringVar(frame1)
weight_var2.set(options2[0])
dropdown2 = tk.OptionMenu(frame2, weight_var2, options2[0], options2[1], options2[2], options2[3], options2[4])
dropdown2.grid(row=1, column=3)
weight_equal_button = Button(frame2, text='=', command=Weight_Error)
weight_equal_button.grid(row=1, column=5)
#======================================================================
temp_entry = Entry(frame3)
temp_entry.grid(row=0, column=0)
temp_label = Label(frame3, relief='groove', width=20, text='')
temp_label.grid(row=0, column=3)
options3 = ['Celsius', 'Fahrenheit', 'Kelvin']
temp_var1 = tk.StringVar(frame3)
temp_var1.set(options3[0])
temp_dropdown1 = tk.OptionMenu(frame3, temp_var1, options3[0], options3[1], options3[2])
temp_dropdown1.grid(row=1, column=0)
temp_var2 = tk.StringVar(frame3)
temp_var2.set(options3[0])
temp_dropdown2 = tk.OptionMenu(frame3, temp_var2, options3[0], options3[1], options3[2])
temp_dropdown2.grid(row=1, column=3)
temp_equal_button = Button(frame3, text='=', command=Temperature_Error)
temp_equal_button.grid(row=1, column=5)
#======================================================================
class logic:
#======================================================================
def Length_Error(*args):
try:
v = float(entry.get())
except ValueError:
label['text']=('Enter Valid Input')
else:
Length_converter()
#======================================================================
def Weight_Error(*args):
try:
v = float(weight_entry.get())
except ValueError:
weight_label['text']=('Enter Valid Input')
else:
Weight_converter()
#======================================================================
def Temperature_Error(*args):
try:
v = float(temp_entry.get())
except ValueError:
temp_label['text']=('Enter Valid Input')
else:
Temperature_converter()
#======================================================================
def Length_converter(*args):
v = float(entry.get())
metre_dict = dict(mm= 0.001, cm= 0.01, m= 1, km= 1000, Inches= 0.0254, Feet= 0.3048, Yards= 0.9144, Miles= 1609.344)
M = v * metre_dict[var1.get()]
k = M / metre_dict[var2.get()]
label['text']=k
#======================================================================
def Weight_converter(*args):
v = float(weight_entry.get())
weight_dict = dict(Grams= 1, Kilograms= 1000, Ounces= 28.34952313, Pounds= 453.59237, Tonnes= 1000000)
M = v * weight_dict[weight_var1.get()]
k = M / weight_dict[weight_var2.get()]
weight_label['text']=k
#======================================================================
def Temperature_converter(*args):
temp_dict = dict(Fahrenheit=(1/1.8, -32/1.8), Celsius=(1, 0), Kelvin=(1, -273.15))
x, y= temp_dict[temp_var1.get()]
cels = float(temp_entry.get()) * x + y
x, y = temp_dict[temp_var2.get()]
answer = (cels - y) / x
temp_label['text']=answer
root.mainloop
如果为逻辑创建类,则它应该获取参数并返回结果,而不使用小部件。 Button应该运行从小部件获取值并将其与Logic一起使用的函数,然后再获取结果并放入小部件。
此类Logic不必记住值,因此我认为方法可以是静态的。
在课堂上,我们将代码评级器放入方法中,然后使用self.
在类中的不同方法中可以访问相同的变量
#### from tkinter import * <-- not preferred
import tkinter as tk
from tkinter import ttk
class GUI:
def __init__(self): # <-- init class
root = tk.Tk() # <-- main window
notebook = ttk.Notebook(root)
frame1 = ttk.Frame(notebook)
notebook.add(frame1, text='Length')
frame2 = ttk.Frame(notebook)
notebook.add(frame2, text='Weight')
frame3 = ttk.Frame(notebook)
notebook.add(frame3, text='Temperature')
notebook.pack(expand=1, fill="both")
#======================================================================
self.entry = tk.Entry(frame1) # <-- self. / tk.
self.entry.grid(row=0, column=0) # <-- self.
self.label = tk.Label(frame1, relief='groove', width=20, text='') # <-- self. / tk.
self.label.grid(row=0, column=3) # <-- self.
options1 = ['mm', 'cm', 'm', 'km', 'Inches', 'Feet', 'Yards', 'Miles']
self.var1 = tk.StringVar(frame1) # <-- self.
self.var1.set(options1[0]) # <-- self.
dropdown1 = tk.OptionMenu(frame1, self.var1, *options1) # <-- self. / *options1
dropdown1.grid(row=1, column=0)
self.var2 = tk.StringVar(frame1) # <-- self.
self.var2.set(options1[0]) # <-- self.
dropdown2 = tk.OptionMenu(frame1, self.var2, *options1) # <-- self. / *options1
dropdown2.grid(row=1, column=3)
equal_button = tk.Button(frame1, text='=', command=self.convert_length) # <-- tk. / function in GUI
equal_button.grid(row=1, column=5)
#======================================================================
self.weight_entry = tk.Entry(frame2) # <-- self. / tk.
self.weight_entry.grid(row=0, column=0) # <-- self.
self.weight_label = tk.Label(frame2, relief='groove', width=20, text='') # <-- self. / tk.
self.weight_label.grid(row=0, column=3) # <-- self.
options2 = ['Grams', 'Kilograms', 'Ounces', 'Pounds', 'Tonnes']
self.weight_var1 = tk.StringVar(frame2) # <-- self.
self.weight_var1.set(options2[0]) # <-- self.
dropdown1 = tk.OptionMenu(frame2, self.weight_var1, *options2) # <-- self. / *options2
dropdown1.grid(row=1, column=0)
self.weight_var2 = tk.StringVar(frame1) # <-- self.
self.weight_var2.set(options2[0]) # <-- self.
dropdown2 = tk.OptionMenu(frame2, self.weight_var2, *options2) # <-- self. / *options2
dropdown2.grid(row=1, column=3)
weight_equal_button = tk.Button(frame2, text='=', command=self.convert_weight) # <-- tk. / function in GUI
weight_equal_button.grid(row=1, column=5)
#======================================================================
self.temp_entry = tk.Entry(frame3) # <-- self. / tk.
self.temp_entry.grid(row=0, column=0) # <-- self.
self.temp_label = tk.Label(frame3, relief='groove', width=20, text='') # <-- self. / tk.
self.temp_label.grid(row=0, column=3) # <-- self.
options3 = ['Celsius', 'Fahrenheit', 'Kelvin']
self.temp_var1 = tk.StringVar(frame3) # <-- self.
self.temp_var1.set(options3[0]) # <-- self.
temp_dropdown1 = tk.OptionMenu(frame3, self.temp_var1, *options3) # <-- self. / *options3
temp_dropdown1.grid(row=1, column=0)
self.temp_var2 = tk.StringVar(frame3) # <-- self.
self.temp_var2.set(options3[0]) # <-- self.
temp_dropdown2 = tk.OptionMenu(frame3, self.temp_var2, *options3) # <-- self. / *options3
temp_dropdown2.grid(row=1, column=3)
temp_equal_button = tk.Button(frame3, text='=', command=self.convert_temp) # <-- tk. / function in GUI
temp_equal_button.grid(row=1, column=5)
#======================================================================
root.mainloop() # <--- () , it starts window
# <-- functions assigned to buttons
def convert_length(self):
var1 = self.var1.get()
var2 = self.var2.get()
try:
value = float(self.entry.get())
except ValueError:
self.label['text'] = 'Enter Valid Input'
return
try:
self.label['text'] = Converter.convert_length(value, var1, var2)
except Exception as ex:
self.label['text'] = 'Exception: {}'.format(ex)
def convert_weight(self):
var1 = self.weight_var1.get()
var2 = self.weight_var2.get()
try:
value = float(self.weight_entry.get())
except ValueError:
self.weight_label['text'] = 'Enter Valid Input'
return
try:
self.weight_label['text'] = Converter.convert_weight(value, var1, var2)
except Exception as ex:
self.weight_label['text'] = 'Exception: {}'.format(ex)
def convert_temp(self):
var1 = self.temp_var1.get()
var2 = self.temp_var2.get()
try:
value = float(self.temp_entry.get())
except ValueError:
self.temp_label['text'] = 'Enter Valid Input'
return
try:
self.temp_label['text'] = Converter.convert_temperature(value, var1, var2)
except Exception as ex:
self.temp_label['text'] = 'Exception: {}'.format(ex)
class Converter: # <-- UpperCaseName
@staticmethod
def convert_length(v, var1, var2): # <-- lower_case_name / arguments
metre_dict = dict(mm= 0.001, cm= 0.01, m= 1, km= 1000, Inches= 0.0254, Feet= 0.3048, Yards= 0.9144, Miles= 1609.344)
M = v * metre_dict[var1]
k = M / metre_dict[var2]
return k
#======================================================================
@staticmethod
def convert_weight(v, var1, var2): # <-- lower_case_name / arguments
weight_dict = dict(Grams= 1, Kilograms= 1000, Ounces= 28.34952313, Pounds= 453.59237, Tonnes= 1000000)
M = v * weight_dict[var1]
k = M / weight_dict[var2]
return k
#======================================================================
@staticmethod
def convert_temperature(v, var1, var2): # <-- lower_case_name / arguments
temp_dict = dict(Fahrenheit=(1/1.8, -32/1.8), Celsius=(1, 0), Kelvin=(1, -273.15))
x, y= temp_dict[var1]
cels = v * x + y
x, y = temp_dict[var2]
return (cels - y) / x
# --- main ----
if __name__ == '__main__':
GUI()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.