鱼C论坛

 找回密码
 立即注册
查看: 1450|回复: 2

写出这个一直又问题还不会改希望大家能够指出一下问题

[复制链接]
发表于 2019-10-14 20:56:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2019-10-14 21:22 编辑
  1. from tkinter import *


  2. class Calculator:
  3.     def __init__(self):
  4.         self.symbol = ['+', '-', 'x', '/']

  5.     def add(self):
  6.         result = int(v1.get()) + int(v2.get())
  7.         v3.set(str(result))

  8.     def reduce(self):
  9.         result = int(v1.get()) - int(v2.get())
  10.         v3.set(str(result))

  11.     def multiply(self):
  12.         result = int(v1.get()) * int(v2.get())
  13.         v3.set(str(result))

  14.     def division(self):
  15.         result = int(v1.get()) / int(v2.get())
  16.         v3.set(str(result))


  17. def main(v):
  18.     cal = Calculator()

  19.     if v == 1:
  20.         q = 0
  21.         compute = cal.add
  22.     elif v == 2:
  23.         q = 1
  24.         compute = cal.reduce
  25.     elif v == 3:
  26.         q = 2
  27.         compute = cal.multiply
  28.     elif v == 4:
  29.         q = 3
  30.         compute = cal.division

  31.     root = Tk()

  32.     frame = Frame(root)
  33.     frame.pack(padx=10, pady=10)

  34.     l1 = Label(frame, text=cal.symbol[q])
  35.     l2 = Label(frame, text='=')
  36.     l1.grid(row=0, column=1)
  37.     l2.grid(row=0, column=3)

  38.     v1 = StringVar()
  39.     v2 = StringVar()
  40.     v3 = StringVar()

  41.     def test(content):
  42.         return content.isdigit()

  43.     testCMD = root.register(test)

  44.     e1 = Entry(frame, textvariable=v1, validate='key', validatecommand=(testCMD, '%P'), width=10)
  45.     e2 = Entry(frame, textvariable=v2, validate='key', validatecommand=(testCMD, '%P'), width=10)
  46.     e3 = Entry(frame, textvariable=v3, state='readonly', width=10)
  47.     e1.grid(row=0, column=0)
  48.     e2.grid(row=0, column=2)
  49.     e3.grid(row=0, column=4)

  50.     b1 = Button(frame, text='确定', command=compute, width=10)
  51.     b2 = Button(frame, text='退出', command=root.quit, width=10)
  52.     b1.grid(row=1, column=0, sticky=W, padx=5)
  53.     b2.grid(row=1, column=4, sticky=E, pady=5)

  54.     mainloop()


  55. def start():
  56.     lap = Tk()

  57.     def count():
  58.         main(v)

  59.     frame = LabelFrame(lap, text='请选择计算种类:')
  60.     frame.pack(padx=15, pady=15)

  61.     list1 = [('加法计算', 1), ('减法计算', 2), ('乘法计算', 3), ('除法计算', 4)]
  62.     v = StringVar()

  63.     for each, num in list1:
  64.         rb = Radiobutton(frame, text=each, variable=v, value=num, indicatoron=FALSE, command=count)
  65.         rb.pack(fill=X)

  66.     mainloop()

  67. start()
复制代码




最后是显示这个错误
  1. Exception in Tkinter callback
  2. Traceback (most recent call last):
  3.   File "C:\Program Files\Python36\lib\tkinter\__init__.py", line 1699, in __call__
  4.     return self.func(*args)
  5.   File "D:/tk7.py", line 79, in count
  6.     main(v)
  7.   File "D:/tk7.py", line 46, in main
  8.     l1 = Label(frame, text=cal.symbol[q])
  9. UnboundLocalError: local variable 'q' referenced before assignment
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-14 21:28:15 | 显示全部楼层
应该加一句 v = int(v.get())。正确代码:

  1. from tkinter import *


  2. class Calculator:
  3.     def __init__(self):
  4.         self.symbol = ['+', '-', 'x', '/']

  5.     def add(self):
  6.         result = int(v1.get()) + int(v2.get())
  7.         v3.set(str(result))

  8.     def reduce(self):
  9.         result = int(v1.get()) - int(v2.get())
  10.         v3.set(str(result))

  11.     def multiply(self):
  12.         result = int(v1.get()) * int(v2.get())
  13.         v3.set(str(result))

  14.     def division(self):
  15.         result = int(v1.get()) / int(v2.get())
  16.         v3.set(str(result))


  17. def main(v):
  18.     cal = Calculator()

  19.     v = int(v.get())
  20.     if v == 1:
  21.         q = 0
  22.         compute = cal.add
  23.     elif v == 2:
  24.         q = 1
  25.         compute = cal.reduce
  26.     elif v == 3:
  27.         q = 2
  28.         compute = cal.multiply
  29.     elif v == 4:
  30.         q = 3
  31.         compute = cal.division

  32.     root = Tk()

  33.     frame = Frame(root)
  34.     frame.pack(padx=10, pady=10)

  35.     l1 = Label(frame, text=cal.symbol[q])
  36.     l2 = Label(frame, text='=')
  37.     l1.grid(row=0, column=1)
  38.     l2.grid(row=0, column=3)

  39.     v1 = StringVar()
  40.     v2 = StringVar()
  41.     v3 = StringVar()

  42.     def test(content):
  43.         return content.isdigit()

  44.     testCMD = root.register(test)

  45.     e1 = Entry(frame, textvariable=v1, validate='key', validatecommand=(testCMD, '%P'), width=10)
  46.     e2 = Entry(frame, textvariable=v2, validate='key', validatecommand=(testCMD, '%P'), width=10)
  47.     e3 = Entry(frame, textvariable=v3, state='readonly', width=10)
  48.     e1.grid(row=0, column=0)
  49.     e2.grid(row=0, column=2)
  50.     e3.grid(row=0, column=4)

  51.     b1 = Button(frame, text='确定', command=compute, width=10)
  52.     b2 = Button(frame, text='退出', command=root.quit, width=10)
  53.     b1.grid(row=1, column=0, sticky=W, padx=5)
  54.     b2.grid(row=1, column=4, sticky=E, pady=5)

  55.     mainloop()


  56. def start():
  57.     lap = Tk()

  58.     def count():
  59.         main(v)

  60.     frame = LabelFrame(lap, text='请选择计算种类:')
  61.     frame.pack(padx=15, pady=15)

  62.     list1 = [('加法计算', 1), ('减法计算', 2), ('乘法计算', 3), ('除法计算', 4)]
  63.     v = StringVar()

  64.     for each, num in list1:
  65.         rb = Radiobutton(frame, text=each, variable=v, value=num, indicatoron=FALSE, command=count)
  66.         rb.pack(fill=X)

  67.     mainloop()

  68. start()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-14 23:23:32 | 显示全部楼层
zltzlt 发表于 2019-10-14 21:28
应该加一句 v = int(v.get())。正确代码:
  1. from tkinter import *


  2. symbol = ['+', '-', 'x', '/']


  3. def main(v):

  4.     root = Tk()

  5.     frame = Frame(root)
  6.     frame.pack(padx=10, pady=10)

  7.     l1 = Label(frame, text=symbol[v - 1])
  8.     l2 = Label(frame, text='=')
  9.     l1.grid(row=0, column=1)
  10.     l2.grid(row=0, column=3)

  11.     v1 = IntVar()
  12.     v2 = IntVar()
  13.     v3 = IntVar()

  14.     def test(content):
  15.         return content.isdigit()

  16.     testCMD = root.register(test)

  17.     e1 = Entry(frame, textvariable=v1, validate='key', validatecommand=(testCMD, '%P'), width=10)
  18.     e2 = Entry(frame, textvariable=v2, validate='key', validatecommand=(testCMD, '%P'), width=10)
  19.     e3 = Entry(frame, textvariable=v3, state='readonly', width=10)
  20.     e1.grid(row=0, column=0)
  21.     e2.grid(row=0, column=2)
  22.     e3.grid(row=0, column=4)

  23.     def add():
  24.         result = int(v1.get()) + int(v2.get())
  25.         v3.set(str(result))
  26.         print(v1.get())
  27.         print(v2.get())
  28.         print(v3.get())

  29.     def reduce():
  30.         result = int(v1.get()) - int(v2.get())
  31.         v3.set(str(result))

  32.     def multiply():
  33.         result = int(v1.get()) * int(v2.get())
  34.         v3.set(str(result))

  35.     def division():
  36.         result = int(v1.get()) / int(v2.get())
  37.         v3.set(str(result))

  38.     if v == 1:
  39.         compute = add
  40.     elif v == 2:
  41.         compute = reduce
  42.     elif v == 3:
  43.         compute = multiply
  44.     elif v == 4:
  45.         compute = division

  46.     b1 = Button(frame, text='确定', command=compute, width=10)
  47.     b2 = Button(frame, text='退出', command=root.quit, width=10)
  48.     b1.grid(row=1, column=0, sticky=W, padx=5)
  49.     b2.grid(row=1, column=4, sticky=E, pady=5)

  50.     mainloop()


  51. def start():
  52.     lap = Tk()

  53.     def count():
  54.         q = int(v.get())
  55.         print(type(q))
  56.         main(q)

  57.     frame = LabelFrame(lap, text='请选择计算种类:')
  58.     frame.pack(padx=15, pady=15)

  59.     list1 = [('加法计算', 1), ('减法计算', 2), ('乘法计算', 3), ('除法计算', 4)]
  60.     v = IntVar()

  61.     for each, num in list1:
  62.         rb = Radiobutton(frame, text=each, variable=v, value=num, indicatoron=FALSE, command=count)
  63.         rb.pack(fill=X)

  64.     mainloop()


  65. start()
复制代码


您看下,我这里稍微改了一下,不过他无论输入什么数,它的v1.get(),v2.get(),和v3.get()都是0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-20 00:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表