免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cdhigh
打印 上一主题 下一主题

[原创]使用VB设计Python的GUI界面(Tkinter Designer) 附源码,[更新V1.5.1] [复制链接]

论坛徽章:
3
处女座
日期:2014-11-05 11:02:4315-16赛季CBA联赛之四川
日期:2015-12-10 14:37:4015-16赛季CBA联赛之天津
日期:2017-09-08 18:39:34
101 [报告]
发表于 2013-03-11 23:50 |只看该作者
楼主是牛人啊,太感谢了

论坛徽章:
0
102 [报告]
发表于 2013-03-12 22:42 |只看该作者
回复 97# vortexroc


    LabelFrame是一个复合控件,由一个Frame和一个Label组成,如果要设置边框上文本显示的大小和颜色,要显式声明设置的子控件,比如:

self.style.configure('TFrame1.TLabelframe.Label', font=('宋体',14),foreground='red')

注意Style字符串最后的".Label",就是指定设置Label子控件。

论坛徽章:
0
103 [报告]
发表于 2013-03-12 22:51 |只看该作者
回复 99# young_py


    tkinter是单线程并且不是线程安全的,界面上所有的刷新都在mainloop中进行,如果要在界面显示耗时比较长的操作,则只能将耗时操作放到一个单独的线程中,然后发送消息给mainloop(可以使用event_generate或其他手段),mainloop和线程的同步可以使用Event或Queue等。
   因为Python的线程编程很简单,所以最终的程序并不会太复杂。
    当然,如果不是要求很高的程序,可以直接在子线程中更新界面Label/Entry等控件背后的"控件变量",尽管官方不推荐此方法,不过我在几个程序中都这样用,一直没有出现什么问题,只是注意的一点是不要在多个子线程中直接更新界面,如果是多线程程序,则只能由一个子线程更新界面(我自己写的一个多线程下载器就是这样使用,几个下载线程统一发送消息给主控子线程,由主控子线程更新界面进度显示)。

论坛徽章:
0
104 [报告]
发表于 2013-03-12 22:53 |只看该作者
回复 100# happyluren


    可能下载的文档不完全,如果论坛下载的有问题,请直接移步下载PDF:
http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html

论坛徽章:
0
105 [报告]
发表于 2013-03-13 11:43 |只看该作者
回复 103# cdhigh
不知道可否发一个浅显易懂的例子给我参考一下,邮箱是youngwang@yeah.net

   

论坛徽章:
0
106 [报告]
发表于 2013-03-15 07:26 |只看该作者
回复 105# young_py

这是一个最简单的例子:
t.rar (1.02 KB, 下载次数: 12)
  1. #!/usr/bin/env python
  2. #-*- coding:utf-8 -*-

  3. import os, sys
  4. try:
  5.     from tkinter import *
  6. except ImportError:  #Python 2.x
  7.     from Tkinter import *
  8.     from tkFont import Font
  9.     from ttk import *
  10.     from tkMessageBox import showinfo
  11. else:  #Python 3.x
  12.     from tkinter import *
  13.     from tkinter.ttk import *
  14.     from tkinter.messagebox import showinfo

  15. from threading import Thread, Event

  16. class Application_ui(Frame):
  17.     def __init__(self, master=None):
  18.         Frame.__init__(self, master)
  19.         self.master.title('Demo')
  20.         self.master.geometry('354x154')
  21.         self.createWidgets()

  22.     def createWidgets(self):
  23.         self.top = self.winfo_toplevel()

  24.         self.style = Style()

  25.         self.lbl**ar = StringVar(value='0')
  26.         self.style.configure('TlblCnt.TLabel', anchor='center', font=('Arial',16))
  27.         self.lblCnt = Label(self.top, text='0', textvariable=self.lbl**ar, style='TlblCnt.TLabel')
  28.         self.lblCnt.place(relx=0.153, rely=0.175, relwidth=0.638, relheight=0.299)

  29.         self.cmdStart = Button(self.top, text='Start', command=self.cmdStart_Cmd)
  30.         self.cmdStart.place(relx=0.051, rely=0.643, relwidth=0.384, relheight=0.24)

  31.         self.cmdStop = Button(self.top, text='Stop', command=self.cmdStop_Cmd)
  32.         self.cmdStop.place(relx=0.534, rely=0.643, relwidth=0.384, relheight=0.24)

  33. class Application(Application_ui):
  34.     def __init__(self, master=None):
  35.         Application_ui.__init__(self, master)
  36.         self.evStop = Event()
  37.         self.thread = None

  38.     def cmdStart_Cmd(self, event=None):
  39.         if self.thread is not None and self.thread.is_alive():
  40.             showinfo('Info', "Thread is runing!")
  41.         else:
  42.             self.evStop.clear()
  43.             self.thread = Thread(target=self.ProcessCnt, args=(self.evStop,1000))
  44.             self.thread.start()
  45.         
  46.     def cmdStop_Cmd(self, event=None):
  47.         if self.thread is None or not self.thread.is_alive():
  48.             showinfo('Info', 'Thread is not alive!')
  49.         else:
  50.             self.evStop.set()
  51.    
  52.     def ProcessCnt(self, evStop, Cnt):
  53.         total = 0
  54.         for i in range(0, Cnt):
  55.             for j in range(100000):  # 示范长时间操作
  56.                 total += 1
  57.                
  58.             self.lbl**ar.set(i)
  59.             
  60.             if evStop.is_set():
  61.                 self.lbl**ar.set("Stopped by User!")
  62.                 return 1  #用户中止
  63.         
  64.         self.lbl**ar.set("Thread Finished!")
  65.         
  66.         
  67. if __name__ == "__main__":
  68.     top = Tk()
  69.     Application(top).mainloop()
复制代码

论坛徽章:
0
107 [报告]
发表于 2013-03-17 16:04 |只看该作者
好东西呀,留下脚印.正为GUI为难呢.

论坛徽章:
0
108 [报告]
发表于 2013-03-17 19:19 |只看该作者
论坛有BUG,经常出现回复看不到,再累积一定的回复后一次显示出来。

论坛徽章:
0
109 [报告]
发表于 2013-03-22 01:35 |只看该作者
更新V1.4.6,感谢vortexroc找到的BUG(92楼),此版本修正。

v1.4.6
    1. 可以在VB中设置窗体在屏幕上的初始位置(通过窗体布局窗口拖动摆放)。
    2. bugfix:修正LabelFrame的标题字体和颜色设置无效的问题。

论坛徽章:
0
110 [报告]
发表于 2013-03-22 12:36 |只看该作者
谢谢分享!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP