鱼C论坛

 找回密码
 立即注册
查看: 1439|回复: 3

[已解决]用tkinter做界面时,窗口出不来。

[复制链接]
发表于 2020-9-23 14:53:49 | 显示全部楼层 |阅读模式

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

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

x
做了一个用pyautocad画cad图的程序,然后想做图形界面化,正在测试基本功能,现在在做的事是 先设定中心点坐标,然后打开有让中心点上移和在中心点画图的两个按钮的界面。
但是现在运行程序,设定完中心点的xy坐标后,idle里一直在运行,界面不出来,就像是陷入死循环一样。是不是调图形界面就不能用input什么的?应该如何解决呢?
  1. import tkinter as tk
  2. import plant

  3. class APP:
  4.     def __init__(self,master):
  5.         frame = tk.Frame(master)
  6.         frame.pack()

  7.         self.changeUpCP = tk.Button(frame,text='向上移动位置',fg ='blue',command = plant.aa.changeUpCP())
  8.         self.juxing = tk.Button(frame,text='画矩形',fg ='blue',command = plant.aa.juxing.plant())
  9.         self.changeUpCP.pack()


  10.         
  11. root =tk.Tk()
  12. root.title('画流程图')
  13. app = APP(root)
  14. root.mainloop()


复制代码


这里面导入的plant。py是这样的
  1. from pyautocad import Autocad, APoint,aDouble
  2. acad = Autocad(create_if_not_exists = True)
  3. import math
  4. import numpy as np
  5. pyacad = Autocad(create_if_not_exists=True)
  6. pyacad.prompt("Hello! AutoCAD from pyautocad.")
  7. print(pyacad.doc.Name)
  8. CPX = 500 #中心点 CenterPointX
  9. CPY = 500 # CenterPointY
  10. DeltaX = 50 #间距
  11. DeltaY = 30
  12. HW = 13 #HalfRWidth 矩形一半宽
  13. HH = 6.5 #HalfRHight 矩形一半高

  14. class SetPoint:
  15.     CPX = 500 #中心点 CenterPointX
  16.     CPY = 500 # CenterPointY
  17.     def creat(self):
  18.         self.juxing = Rectangle()
  19.         self.lingxing = Choose()
  20.         self.wenzi = InsertText()

  21.     def set_CP(self):
  22.         self.CPX = float(input('请输入x坐标:'))
  23.         self.CPY = float(input('请输入y坐标:'))
  24.         self.juxing.set_CP()
  25.         self.lingxing.set_CP()
  26.         self.wenzi.set_CP()
  27.         

  28.     def set_Delta(self):
  29.         Delta = float(input('请设置间隔:'))
  30.         DeltaX = Delta + 2*HW
  31.         DeltaY = Delta + 2*HH

  32.     def set_RWH(self):
  33.         self.juxing.set_RWH()

  34.     def set_RCH(self):
  35.         self.lingxing.set_RWH()


  36.     def changeUpCP(self):
  37.         self.juxing.changeUpCP()
  38.         self.lingxing.changeUpCP()
  39.         self.wenzi.changeUpCP()
  40.    
  41.     def changeDownCP(self):
  42.         self.juxing.changeDownCP()
  43.         self.lingxing.changeDownCP()
  44.         self.wenzi.changeDownCP()

  45.     def changeLeftCP(self):
  46.         self.juxing.changeLeftCP()
  47.         self.lingxing.changeLeftCP()
  48.         self.wenzi.changeLeftCP()


  49.     def changeRightCP(self):
  50.         self.juxing.changeRightCP()
  51.         self.lingxing.changeRightCP()
  52.         self.wenzi.changeRightCP()

  53. class Rectangle:
  54.     HRW = 13 #HalfRWidth 矩形一半宽
  55.     HRH = 6.5 #HalfRHight 矩形一半高
  56.     DeltaX = 50 #间距
  57.     DeltaY = 30
  58.    
  59.     def set_CP(self):
  60.         self.CPX = aa.CPX
  61.         self.CPY = aa.CPY
  62.     def set_Delta(self):
  63.         self.Delta = aa.Delta
  64.         self.DeltaX = Delta + 2*HW
  65.         self.DeltaY = Delta + 2*HH

  66.     def set_RWH(self):
  67.         self.HRW = float(input('请输入矩形的宽度:'))/2
  68.         self.HRH = float(input('请输入矩形的高度:'))/2

  69.     def changeUpCP(self):
  70.         self.CPY = self.CPY + self.DeltaY
  71.    
  72.     def changeDownCP(self):
  73.         self.CPY = self.CPY - self.DeltaY

  74.     def changeLeftCP(self):
  75.         self.CPX = self.CPX - self.DeltaX


  76.     def changeRightCP(self):
  77.         self.CPX = self.CPX + self.DeltaX

  78.         
  79.     def plant(self):
  80.         x = [self.CPX-self.HRW,self.CPX+self.HRW,self.CPX+self.HRW,self.CPX-self.HRW]
  81.         y = [self.CPY+self.HRH,self.CPY+self.HRH,self.CPY-self.HRH,self.CPY-self.HRH]
  82.         pnts = [APoint(x[0], y[0]), APoint(x[1], y[1]), APoint(x[1], y[1]),
  83.         APoint(x[2], y[2]), APoint(x[2], y[2]), APoint(x[3], y[3]),
  84.         APoint(x[3], y[3]), APoint(x[0], y[0])]
  85.         pnts = [j for i in pnts for j in i]  # 将各点坐标顺序变换为行数据
  86.         pnts = aDouble(pnts)  # 转化为双精度浮点数
  87.         plineObj = pyacad.model.AddPolyLine(pnts)
  88.         plineObj.Closed = True  # 闭合多段线


  89.         
  90. class Choose:
  91.     HCW = 13 #HalfRWidth 矩形一半宽
  92.     HCH = 6.5 #HalfRHight 矩形一半高
  93.     DeltaX = 50 #间距
  94.     DeltaY = 30
  95.    
  96.     def set_CP(self):
  97.         self.CPX = aa.CPX
  98.         self.CPY = aa.CPY

  99.     def set_Delta(self):
  100.         self.Delta = aa.Delta
  101.         self.DeltaX = Delta + 2*HW
  102.         self.DeltaY = Delta + 2*HH

  103.     def set_CWH(self):
  104.         self.HCW = float(input('请输入菱形的宽度:'))/2
  105.         self.HCH = float(input('请输入菱形的高度:'))/2

  106.     def changeUpCP(self):
  107.         self.CPY = self.CPY + self.DeltaY
  108.    
  109.     def changeDownCP(self):
  110.         self.CPY = self.CPY - self.DeltaY

  111.     def changeLeftCP(self):
  112.         self.CPX = self.CPX - self.DeltaX


  113.     def changeRightCP(self):
  114.         self.CPX = self.CPX + self.DeltaX

  115.     def plant(self):
  116.         x = [self.CPX,self.CPX+self.HCW,self.CPX,self.CPX-self.HCW]
  117.         y = [self.CPY+self.HCH,self.CPY,self.CPY-self.HCH,self.CPY]
  118.         pnts = [APoint(x[0], y[0]), APoint(x[1], y[1]), APoint(x[1], y[1]),
  119.         APoint(x[2], y[2]), APoint(x[2], y[2]), APoint(x[3], y[3]),
  120.         APoint(x[3], y[3]), APoint(x[0], y[0])]
  121.         pnts = [j for i in pnts for j in i]  # 将各点坐标顺序变换为行数据
  122.         pnts = aDouble(pnts)  # 转化为双精度浮点数
  123.         plineObj = pyacad.model.AddPolyLine(pnts)
  124.         plineObj.Closed = True  # 闭合多段线

  125. class InsertText:
  126.     DeltaX = 50 #间距
  127.     DeltaY = 30
  128.    
  129.     def set_CP(self):
  130.         self.CPX = aa.CPX
  131.         self.CPY = aa.CPY

  132.     def set_Delta(self):
  133.         self.Delta = aa.Delta
  134.         self.DeltaX = Delta + 2*HCW
  135.         self.DeltaY = Delta + 2*HCH

  136.     def changeUpCP(self):
  137.         self.CPY = self.CPY + self.DeltaY
  138.    
  139.     def changeDownCP(self):
  140.         self.CPY = self.CPY - self.DeltaY

  141.     def changeLeftCP(self):
  142.         self.CPX = self.CPX - self.DeltaX


  143.     def changeRightCP(self):
  144.         self.CPX = self.CPX + self.DeltaX
  145.         
  146.     def in_text(self):
  147.         p = APoint(self.CPX,self.CPY)
  148.         text = input('请输入要插入的文字')
  149.         #text = acad.model.AddText('Hi !' , p, 2.5)
  150.         insert = acad.model.AddText("{0}".format(text), p, 3)
  151.         
  152. aa=SetPoint()
  153. aa.creat()
  154. aa.set_CP()
  155.    
  156.    


复制代码
最佳答案
2020-9-24 11:37:56
求资专用 发表于 2020-9-24 11:23
后面尝试了一下我的代码窗口是能出来的,
请问不用实例化而用if __name__ == '__main__':  的原因是什么 ...

你要问我原理,讲不清楚,但就是这么用的

你要调用的是plant里类下面的某个方法,那就用
  1. command=plant.SetPoint().a
复制代码
的形式,
不般不会去引用实例化后的对象,具体对不对,等其他大佬解释和指出错误

一般定义类,都是class SetPoint(),会带个括号
command等号后面跟着的是方法名,所以方法a会面没有括号

你的代码,我没有pyautocad 所以没法运行

但如果使用您说的command = plant.aa.juxing().plant,会报错啊?
我没有说用这样的形式,我说的是command=模块名.类名.方法名
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-23 16:50:23 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-9-23 16:52 编辑

你这个调用有问题啊,不是input的问题
plant里class类后面应该有()才对吧
一般这里不要实例化,一般写成:
  1. if __name__ == '__main__':   
  2.     aa = SetPoint()
  3.     aa.creat()
  4.     aa.set_CP()
复制代码

调用时再引用对应方法


没有你的模块,所以只能注释掉模块,在类里面添加一个
  1. def a(self):
  2.         print('1')
复制代码

然后这个界面
  1. command=plant.SetPoint().a
复制代码

这样就能调用了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-24 11:23:12 | 显示全部楼层
疾风怪盗 发表于 2020-9-23 16:50
你这个调用有问题啊,不是input的问题
plant里class类后面应该有()才对吧
一般这里不要实例化,一般写成 ...

后面尝试了一下我的代码窗口是能出来的,
请问不用实例化而用if __name__ == '__main__':  的原因是什么呢?
另外 ,是
  1. command=plant.SetPoint().a
复制代码
么?为什么不是
  1. command=plant.SetPoint.a()
复制代码
呢?
我尝试了一下,如果用command = plant.aa.juxing.plant()没有执行该有的结果,但如果使用您说的command = plant.aa.juxing().plant,会报错啊?
  1. Traceback (most recent call last):
  2.   File "C:\Users\abc\Desktop\tuxingjiemian.py", line 24, in <module>
  3.     app = APP(root)
  4.   File "C:\Users\abc\Desktop\tuxingjiemian.py", line 12, in __init__
  5.     self.juxing = tk.Button(frame,text='画矩形',fg ='blue',command = plant.aa.juxing().plant)
  6. TypeError: 'Rectangle' object is not callable
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-24 11:37:56 | 显示全部楼层    本楼为最佳答案   
求资专用 发表于 2020-9-24 11:23
后面尝试了一下我的代码窗口是能出来的,
请问不用实例化而用if __name__ == '__main__':  的原因是什么 ...

你要问我原理,讲不清楚,但就是这么用的

你要调用的是plant里类下面的某个方法,那就用
  1. command=plant.SetPoint().a
复制代码
的形式,
不般不会去引用实例化后的对象,具体对不对,等其他大佬解释和指出错误

一般定义类,都是class SetPoint(),会带个括号
command等号后面跟着的是方法名,所以方法a会面没有括号

你的代码,我没有pyautocad 所以没法运行

但如果使用您说的command = plant.aa.juxing().plant,会报错啊?
我没有说用这样的形式,我说的是command=模块名.类名.方法名
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-27 13:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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