这是tkinter的代码,command参数表示按钮对应的动作,这个参数是个函数
# 操作符按钮 self.btn_add = tk.Button(self.tkwindow, text='+', command=self.command_add) self.btn_add.pack(padx=1, side='left') self.btn_minus = tk.Button(self.tkwindow, text='-', command=self.command_minus) self.btn_minus.pack(padx=1, side='left') self.btn_multiply = tk.Button(self.tkwindow, text='*', command=self.command_multipy) self.btn_multiply.pack(padx=1, side='left') self.btn_divide = tk.Button(self.tkwindow, text='/', command=self.command_divide) self.btn_divide.pack(padx=1, side='left') ''' 省略 ''' def command_add(self): if self.op_can_use: self.op_now = '+' self.op_pressed = True def command_minus(self): if self.op_can_use: self.op_now = '-' self.op_pressed = True def command_multipy(self): if self.op_can_use: self.op_now = '*' self.op_pressed = True def command_divide(self): if self.op_can_use: self.op_now = '/' self.op_pressed = True
但这4个command的函数几乎长得一模一样啊,有四个还好,如果有十几个怎么办,能不能精简点
def command_op(self, op): if self.op_can_use: self.op_now = op self.op_pressed = True def command_add(self): return self.command_op('+') def command_minus(self): return self.command_op('-') def command_multipy(self): return self.command_op('*') def command_divide(self): return self.command_op('/')
和dict配合使用
self.opdict = {'+': add, '-': minus, '*': multiply, '/': divide} #这是调用,根据op_now选择对应的函数,代替if判断 self.opnum = self.opdict[self.op_now](self.opnum, self.num_temp)[0]
全部代码,计算24点,用tkinter做了界面,两个文件一个界面,一个计算24点的函数
# enconding:utf-8 # file point24/gui import tkinter as tk import random from point24.bk import cal_24point, add, minus, multiply, divide class Window: def __init__(self, title='24点', width=650, height=400): self.w = width self.h = height self.tkwindow = tk.Tk(className=title) self.opdict = {'+': add, '-': minus, '*': multiply, '/': divide} self.init_status() self.add_compnent() def init_status(self): self.op_pressed = False self.op_now = '' self.opnum = 0 self.num_temp = 0 self.num_count = 0 self.op_can_use = False self.btn_num_temp_used = False def fournumber(self): TEN_OR_K = 10 self.num1 = random.randint(1, TEN_OR_K) self.num2 = random.randint(1, TEN_OR_K) self.num3 = random.randint(1, TEN_OR_K) self.num4 = random.randint(1, TEN_OR_K) def add_compnent(self): B_WIDTH = 6 B_HEIGHT = 5 self.label_ans = tk.Label(text="answer", fg="black", bg="white") self.label_ans.pack() # 数字按钮 self.fournumber() self.btn_num1 = tk.Button(self.tkwindow, text=self.num1, command=self.command_num1, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_num1.pack(side='left') self.btn_num2 = tk.Button(self.tkwindow, text=self.num2, command=self.command_num2, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_num2.pack(side='left') self.btn_num3 = tk.Button(self.tkwindow, text=self.num3, command=self.command_num3, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_num3.pack(side='left') self.btn_num4 = tk.Button(self.tkwindow, text=self.num4, command=self.command_num4, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_num4.pack(side='left') self.btn_num_temp = tk.Button(self.tkwindow, text=self.num_temp, command=self.command_num_temp, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_num_temp.pack(side='bottom') # 操作符按钮 self.btn_add = tk.Button(self.tkwindow, text='+', command=self.command_add, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_add.pack(padx=1, side='left') self.btn_minus = tk.Button(self.tkwindow, text='-', command=self.command_minus, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_minus.pack(padx=1, side='left') self.btn_multiply = tk.Button(self.tkwindow, text='*', command=self.command_multipy, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_multiply.pack(padx=1, side='left') self.btn_divide = tk.Button(self.tkwindow, text='/', command=self.command_divide, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_divide.pack(padx=1, side='left') # 功能按钮 self.btn_change = tk.Button(self.tkwindow, text='换一组', command=self.command_change, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_change.pack(padx=1, side='right') self.btn_answer = tk.Button(self.tkwindow, text='显示答案', command=self.command_answer, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_answer.pack(padx=1, side='right') self.btn_clear = tk.Button(self.tkwindow, text='清除', command=self.command_clear, width=B_WIDTH, height=B_HEIGHT,relief='groove') self.btn_clear.pack(padx=1, side='right') # 一个数字只能按一次,按错了用clear重来 def command_clear(self): self.btn_num1['state'] = 'active' self.btn_num2['state'] = 'active' self.btn_num3['state'] = 'active' self.btn_num4['state'] = 'active' self.btn_num_temp['state'] = 'active' self.btn_num_temp['text'] = '0' self.label_ans['text'] = 'answer' self.init_status() def command_answer(self): ans = cal_24point(self.num1, self.num2, self.num3, self.num4) self.label_ans['text'] = str(ans) def command_change(self): self.fournumber() self.btn_num1['text'] = self.num1 self.btn_num2['text'] = self.num2 self.btn_num3['text'] = self.num3 self.btn_num4['text'] = self.num4 self.command_clear() def command_op(self, op): if self.op_can_use: self.op_now = op self.op_pressed = True def command_add(self): return self.command_op('+') def command_minus(self): return self.command_op('-') def command_multipy(self): return self.command_op('*') def command_divide(self): return self.command_op('/') def command_num_temp(self): if self.op_pressed: self.opnum = self.opdict[self.op_now](self.opnum, self.num_temp)[0] self.btn_num_temp['text'] = self.opnum self.num_temp = self.opnum else: self.opnum = self.num_temp print(self.opnum) self.op_pressed = False self.btn_num_temp['state'] = 'disabled' if self.opnum == 24: self.label_ans['text'] = 'right' def command_numwhich(self, num, btn_num): if self.op_pressed: self.opnum = self.opdict[self.op_now](self.opnum, num)[0] if not self.btn_num_temp_used: self.btn_num_temp['text'] = self.opnum self.num_temp = self.opnum self.btn_num_temp_used = True else: self.opnum = num print(self.opnum) self.op_pressed = False btn_num['state'] = 'disabled' self.op_can_use = True self.num_count += 1 if self.opnum == 24 and self.num_count ==4: self.label_ans['text'] = 'right' def command_num1(self): return self.command_numwhich(self.num1, self.btn_num1) def command_num2(self): return self.command_numwhich(self.num2, self.btn_num2) def command_num3(self): return self.command_numwhich(self.num3, self.btn_num3) def command_num4(self): return self.command_numwhich(self.num4, self.btn_num4) def center(self): ws = self.tkwindow.winfo_screenwidth() hs = self.tkwindow.winfo_screenheight() x = int((ws/2)-(self.w/2)) y = int((hs/2)-(self.h/2)) self.tkwindow.geometry('{}x{}+{}+{}'.format(self.w, self.h, x, y)) def loop(self): self.tkwindow.resizable(False, False) self.center() self.tkwindow.mainloop() # ##############################run################################## w = Window() w.loop()
# encoding:utf-8 # file point24/bk import itertools import random def add(a, b): return a+b, str(a)+'+'+str(b)+'='+str(a+b) def minus(a, b): # 打印答案时不要有负数 if a<b: return 9999, 'no' return a-b, str(a)+'-'+str(b)+'='+str(a-b) def multiply(a, b): return a*b, str(a)+'*'+str(b)+'='+str(a*b) def divide(a, b): if b == 0: return 9999, 'no' return a/b, str(a)+'/'+str(b)+'='+str(a/b) def cal_24point(a, b, c, d): # a, b, c, d的排列组合 permutation_list = list(itertools.permutations([a, b, c, d], 4)) # 加减乘除 排列组合 op_list = list(itertools.permutations([add, minus, multiply, divide], 4)) # pro1 到 pro5包装函数 # ((a, b), c), d def pro1(op1, op2, op3): m = op1(pmt[0], pmt[1]) n = op2(m[0], pmt[2]) result = op3(n[0], pmt[3]) if result[0] == 24: #print(m[1], n[1], result[1]) return (m[1], n[1], result[1]) # (c, (a, b)), d def pro2(op1, op2, op3): m = op1(pmt[0], pmt[1]) n = op2(pmt[2] , m[0]) result = op3(n[0], pmt[3]) if result[0] == 24: #print(m[1], n[1], result[1]) return (m[1], n[1], result[1]) # d, ((a, b), c) def pro3(op1, op2, op3): m = op1(pmt[0], pmt[1]) n = op2(m[0], pmt[2]) result = op3(pmt[3], n[0]) if result[0] == 24: #print(m[1], n[1], result[1]) return (m[1], n[1], result[1]) # d, (c, (a, b)) def pro4(op1, op2, op3): m = op1(pmt[0], pmt[1]) n = op2(pmt[2], m[0]) result = op3(pmt[3], n[0]) if result[0] == 24: #print(m[1], n[1], result[1]) return (m[1], n[1], result[1]) # (a b)(c d) def pro5(op1, op2, op3): m = op1(pmt[0], pmt[1]) n = op2(pmt[2], pmt[3]) result = op3(n[0], m[0]) if result[0] == 24: #print(m[1], n[1], result[1]) return (m[1], n[1], result[1]) for pmt in permutation_list: for op in op_list: # 相同运算符 if pro1(op[0], op[0], op[0]): return pro1(op[0], op[0], op[0]) if pro2(op[0], op[0], op[0]): return pro2(op[0], op[0], op[0]) if pro3(op[0], op[0], op[0]): return pro3(op[0], op[0], op[0]) if pro4(op[0], op[0], op[0]): return pro4(op[0], op[0], op[0]) if pro5(op[0], op[0], op[0]): return pro5(op[0], op[0], op[0]) # ((a, b), c), d if pro1(op[0], op[1], op[2]): return pro1(op[0], op[1], op[2]) if pro1(op[0], op[1], op[1]): return pro1(op[0], op[1], op[1]) if pro1(op[0], op[0], op[1]): return pro1(op[0], op[0], op[1]) if pro1(op[0], op[1], op[0]): return pro1(op[0], op[1], op[0]) # (c, (a, b)), d if pro2(op[0], op[1], op[2]): return pro2(op[0], op[1], op[2]) if pro2(op[0], op[1], op[1]): return pro2(op[0], op[1], op[1]) if pro2(op[0], op[0], op[1]): return pro2(op[0], op[0], op[1]) if pro2(op[0], op[1], op[0]): return pro2(op[0], op[1], op[0]) # d, ((a, b), c) if pro3(op[0], op[1], op[2]): return pro3(op[0], op[1], op[2]) if pro3(op[0], op[1], op[1]): return pro3(op[0], op[1], op[1]) if pro3(op[0], op[0], op[1]): return pro3(op[0], op[0], op[1]) if pro3(op[0], op[1], op[0]): return pro3(op[0], op[1], op[0]) # d, (c, (a, b)) if pro4(op[0], op[1], op[2]): return pro4(op[0], op[1], op[2]) if pro4(op[0], op[1], op[1]): return pro4(op[0], op[1], op[1]) if pro4(op[0], op[0], op[1]): return pro4(op[0], op[0], op[1]) if pro4(op[0], op[1], op[0]): return pro4(op[0], op[1], op[0]) # (a b)(c d) if pro5(op[0], op[1], op[2]): return pro5(op[0], op[1], op[2]) if pro5(op[0], op[1], op[1]): return pro5(op[0], op[1], op[1]) if pro5(op[0], op[0], op[1]): return pro5(op[0], op[0], op[1]) if pro5(op[0], op[1], op[0]): return pro5(op[0], op[1], op[0]) print('no result') return None # ---------------------------test--------------------------------- ''' for n in range(30): a = random.randint(1,13) b = random.randint(1,13) c = random.randint(1,13) d = random.randint(1,13) print(a, b, c, d) print(cal_24point(a, b, c, d),'*'*10) '''
界面是难看了点 ,哈哈哈哈