JAVA程序设计,使用GUI界面

JAVA程序设计,使用GUI界面,第1张

效脊哗果图

参考代码

import java.awt.*

import 掘悄java.awt.event.*

import javax.swing.*

public class KeyFrame extends JFrame implements KeyListener{

JLabel jlkey

public KeyFrame() {

jlkey = new JLabel("请输入字母或者数字,其他字符不显示")

add(jlkey)

addKeyListener(this)

setLayout(new FlowLayout())

setSize(260, 160)

setTitle("输入...")

setLocationRelativeTo(null)

setDefaultCloseOperation(EXIT_ON_CLOSE)

setVisible(true)

}

public static void main(String[] args) {

new KeyFrame()

}

public void keyTyped(KeyEvent e) {//敲击键盘

c=e.getKeyChar()//得到键入的字符

repaint()//重绘

}

public void keyPressed(KeyEvent e) {//按下键盘

// c=e.getKeyChar()

// repaint()

}

public void keyReleased(KeyEvent e) {//释放键盘

}

char c 

@Override

public void paint(Graphics g) {

super.paint(g)

//如果只能显示输入樱散行的是字母或者数字,那么需要if判断下

if((c<='Z'&& c>='A')||(c<='z'&&c>='a')||(c<='9'&&c>='0')){// 注意比较的是字符 '9' 和字符'0'

Font font = g.getFont()

g.setColor(Color.BLUE)

g.setFont(new Font(font.getName(),font.getStyle(),20))

g.drawString(c+"",100, 100) //绘制

}

}

}

话说,python做图形界面并不明智,效率并不高。但在某些特殊需求下还是需要我们去使用,所以python拥有多个第三方库用以实现GUI,本章我们使用python基本模块tkinter进行学习,因为需求并不大,所以不做太多拓展。

继续改写上一章的IP查询系统(= =,要玩烂了),首先神笑略改下IpWhere.py以备调用~

然后使用tkinter模块进行图形界面的实现,调用预编译的IpWhere模块 :

额,太丑了,但基本实现我们小小的需求,在以后的py学习中,我们再涉及其他的第三方模块,此处就当是入门了解吧。

十分抱歉把这么重要的内容放在最后,要不是大佬指点,此次学习可能就要错过多进程的问题了。

Unix系统提供了forx,python可借助os模块调用,从而实现多进程,然而windows系统并不具备,所以我们选择python内置的multiprocessing多进程模块进行学习。

首先我们借助直接调用多进程来改写下我们在多线程章节用到的例子!

显然,这么写实在太蠢了,如果我们的任务量巨大,这并不合适。所以我们引入了进程池的概念,使用进程池颤瞎拿进行改写:

在此,我们可以看到所有进程是并发执行的,同样,我们在多线程章节就讲过,主进程的结束意味着程序退出,所以我们需要借助join()方法堵塞进程。

我们知道线程共享内存空间,而进程的内存是独立的,同一个进程的线程之间可以直接交流,也就带来了线程同步的苦恼,这个我们在多线程章节已经讲过了;而两个进程想通信,则必须通过一个中间代理来实现,即我们接下来的内容:进程间通信。

进程之间肯定是需要通信的, *** 作系统提供了很多机制来实现进程间的通信。Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。我们接下来就以Queue的方式进行学习。

Queue.Queue是进程内非阻塞队列,multiprocess.Queue是跨进程通信队列,前者是各自私有,后者是各子进程共有。

还有一个在后者基础上进行封装的multiprocess.Manager.Queue()方法,如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则会得到一条如下的错误信息: RuntimeError: Queue objects should only be shared between processes through inheritance.

接下来我们就借助进程池来进行多进程 *** 作的改写,感谢大佬一路辅导。

我们可以看到两个子线程先执行,然后一个子线程单独执行,此处有意而为之,让大家更清晰的了解队列的使用。期间有一处我们放弃使用jion()方法堵塞,而是自己写了个循环堵塞,大家根据自己习惯来就好。

话说,真的没人吐槽么?上面的例子从需求上来讲,完全就不需要多线程好不好!emmmm,我们来点实力拓展,写一个有智商的多线程脚本,顺便结合上一节的web来一个综合篇,随便找个现实需求吧!

emmm,比如我们来到当当网买书,搜一下我们想要的书籍,发现!!太多了!!真茄搭J2乱!!看不过来!!不想翻页!!直接告诉我哪个便宜、哪个牛逼好不好!!

简单看下这个url:

http://search.dangdang.com/?key=渗透测试&ddsale=1&page_index=2

其中ddsale参数代表当当自营,page_index代表页数,key代表搜索内容,我们本次的变量只有页数。

所以我们构造请求的url为:

'http://search.dangdang.com/?key=渗透测试&ddsale=1&page_index='+str(page)

如果修改的内容不使用str字符串转化,会收到如下报错:

TypeError: can only concatenate str (not "int") to str

然后我们看一下页面内容的分布情况,本次我们关心卖什么书,卖多少钱?

对应的编写我们的正则匹配规则,当然了,有更简便的第三方库可以帮我们处理,但为了更好的形成流程性认识,我们这里依然使用正则。

我们对应我们需要的书籍名称和当前价格匹配如下:

<a title=" (.*?)" ddclick=

<span class="search_now_price">¥(.*?)</span>

那么,思路理清了,我们就开始使用多线程来写我们的小系统~

然后我们去查看一下我们的结果文件~

现在这个小系统具备的功能就是根据用户需要选择要检索的书籍,然后整理下名称和价格,开了10个线程,如果小伙伴pc给力的话可以继续加。简单的异常处理机制和界面交互,基本满足日常所需。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12427808.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存