2016年9月

跨线程调用invoke导致界面卡死

跨线程操作控件

首先相关的文章在其他人的博客上已经有不少了,这里也是参考了其他人的写法。
在实际的开发中,经常需要在另外的线程中操作界面的控件,这个时候因为创建控件的UI线程和实际的工作线程不是同一个线程,所以会报一个不允许的操作异常,这个时候有几种解决方法。

  1. 直接禁用编译器做检查,这个不推荐(都是这么说的,我也就没用过)

//在窗口初始化完成后加入这一行
Control.CheckForIllegalCrossThreadCalls = false;
  1. 使用Invoke,模板代码

//
    private delegate void SetButtonTextDelegate(Button b, string text);
    private void SetButtonText(Button b, string text)
    {
        if (this.InvokeRequired)
        {
            SetButtonTextDelegate setButtonTextDelegate = new SetButtonTextDelegate(SetButtonText);
            b.Invoke(setButtonTextDelegate, new object[] { b, text });
        }
        else
        {
            b.Text = text;
        }
    }

    //在调用的时候
    SetButtonText(btn**,"测试数据");

InvokeRequired方法代表的是操作控件的线程是不是创建控件的线程,不是的话为True就调用Invoke,是的话直接执行b.Text = text
可以这样还是有问题,我在触发事件的时候还是会卡住,所以使用了下面的方法

  1. 使用BeginInvoke

       private delegate void SetButtonTextDelegate(Button b, string text);
       private void SetButtonText(Button b, string text)
       {
           if (this.InvokeRequired)
           {
               SetButtonTextDelegate setButtonTextDelegate = new SetButtonTextDelegate(SetButtonText);
               b.BeginInvoke(setButtonTextDelegate, new object[] { b, text });
           }
           else
           {
               b.Text = text;
           }
       }
    

仅仅是把上面的Invoke换成了BeginInvoke解决了问题。

Python坑记录

主要记录学习python中遇到的一些坑,不定时更新


  1. TypeError: string indices must be integers异常

出现的场景是:

resultText = r.text
print(resultText['code'])

这里通过r.tex获取到的数据为{"code":1,"msg":"连续输入密码错误超过5次,请12小时后再试"},我以为这个是字典类型,直接按照上面的方式进行取值,就会出现TypeError异常。
我直接进去python命令行调试,却是可以得到数据

解决方法
导入json库进行解析

import json
result = json.loads(r.text)
print(result.get('msg'))
#print(result['msg'])

原因
r.text返回的数据被解析为str类型,不是dict。手动转换一下就好了

2.安装Selenium
直接通过pip安装出错,需要下载源代码,通过install安装
selenium官方网站,下载selenium页面,里面也包含了安装方法。在python2中使用setup.py install命令好像还是有问题。使用python3 setup.py install安装解决
顺便安装 PlantomJS,是一个功能完善没有界面的浏览器。官方网站,备用

我的第一个Python小爬虫

前段时间看到Lativ官网衣服挺好看的,本来想把模特的照片全都弄下来的,现在已经没有那个模特集合的页面了,这都是废话,重点是我终于写出了第一个python小爬虫。


from urllib.request import urlopen
from urllib.request import urlretrieve
from bs4 import BeautifulSoup

# 获取网页内容
# html_doc =urlopen('http://www.pythonscraping.com/pages/page3.html')
html_doc = urlopen('http://www.baihe.com')
# 新建BeautifulSoup对象
soup = BeautifulSoup(html_doc,'html.parser')
# 打印所有的图片链接
# for img in soup.findAll('img'):
#     print(img['src'])
i = 1
for img in soup.select('img'):
    print(img['src'])
    # print('./Image/'+str(i)+'.jpg')
    print('正在保存第%d个图片'%i)
    # 将得到的图片下载下来保存到本地
    urlretrieve(img['src'],'./Image/'+str(i)+'.jpg')
    i+=1

代码非常简单,可也写了一个晚自习。也有很多方面没有实现好

  • 暂时没有提供选择, 只下载了百合网的照片

  • 找到img中标签必须有src属性,src链接必须得是网址

  • 保存的时候img中有两张图片后缀是gif的没有做处理

  • 保存路径没有提供选择

  • 报名文件名是数字不直观

  • 想找的话还有好多。。。。

不过这些都够了,至少保存了一些照片。截图为证
啦啦啦

我也太俗了,哈哈。
最近修改努力让它变成一个厉害的蜘蛛,爬啊爬。

软件破解备忘

这片文章也是没谁了。。。

IntelliJ Idea

43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IkZvciBlZHVjYXRpb25hbCB1c2Ugb25seSIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInByb2R1Y3RzIjpbeyJjb2RlIjoiSUkiLCJwYWlkVXBUbyI6IjIwMTctMDItMjUifSx7ImNvZGUiOiJBQyIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9LHsiY29kZSI6IkRQTiIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9LHsiY29kZSI6IlBTIiwicGFpZFVwVG8iOiIyMDE3LTAyLTI1In0seyJjb2RlIjoiRE0iLCJwYWlkVXBUbyI6IjIwMTctMDItMjUifSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9LHsiY29kZSI6IlJTMCIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9LHsiY29kZSI6IlJDIiwicGFpZFVwVG8iOiIyMDE3LTAyLTI1In0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMTctMDItMjUifSx7ImNvZGUiOiJSTSIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9LHsiY29kZSI6IldTIiwicGFpZFVwVG8iOiIyMDE3LTAyLTI1In0seyJjb2RlIjoiREIiLCJwYWlkVXBUbyI6IjIwMTctMDItMjUifSx7ImNvZGUiOiJEQyIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9XSwiaGFzaCI6IjMzOTgyOTkvMCIsImdyYWNlUGVyaW9kRGF5cyI6MCwiYXV0b1Byb2xvbmdhdGVkIjpmYWxzZSwiaXNBdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlfQ==-keaxIkRgXPKE4BR/ZTs7s7UkP92LBxRe57HvWamu1EHVXTcV1B4f/KNQIrpOpN6dgpjig5eMVMPmo7yMPl+bmwQ8pTZaCGFuLqCHD1ngo6ywHKIQy0nR249sAUVaCl2wGJwaO4JeOh1opUx8chzSBVRZBMz0/MGyygi7duYAff9JQqfH3p/BhDTNM8eKl6z5tnneZ8ZG5bG1XvqFTqWk4FhGsEWdK7B+He44hPjBxKQl2gmZAodb6g9YxfTHhVRKQY5hQ7KPXNvh3ikerHkoaL5apgsVBZJOTDE2KdYTnGLmqxghFx6L0ofqKI6hMr48ergMyflDk6wLNGWJvYHLWw==-MIIEPjCCAiagAwIBAgIBBTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE1MTEwMjA4MjE0OFoXDTE4MTEwMTA4MjE0OFowETEPMA0GA1UEAwwGcHJvZDN5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQC9WZuYgQedSuOc5TOUSrRigMw4/+wuC5EtZBfvdl4HT/8vzMW/oUlIP4YCvA0XKyBaCJ2iX+ZCDKoPfiYXiaSiH+HxAPV6J79vvouxKrWg2XV6ShFtPLP+0gPdGq3x9R3+kJbmAm8w+FOdlWqAfJrLvpzMGNeDU14YGXiZ9bVzmIQbwrBA+c/F4tlK/DV07dsNExihqFoibnqDiVNTGombaU2dDup2gwKdL81ua8EIcGNExHe82kjF4zwfadHk3bQVvbfdAwxcDy4xBjs3L4raPLU3yenSzr/OEur1+jfOxnQSmEcMXKXgrAQ9U55gwjcOFKrgOxEdek/Sk1VfOjvS+nuM4eyEruFMfaZHzoQiuw4IqgGc45ohFH0UUyjYcuFxxDSU9lMCv8qdHKm+wnPRb0l9l5vXsCBDuhAGYD6ss+Ga+aDY6f/qXZuUCEUOH3QUNbbCUlviSz6+GiRnt1kA9N2Qachl+2yBfaqUqr8h7Z2gsx5LcIf5kYNsqJ0GavXTVyWh7PYiKX4bs354ZQLUwwa/cG++2+wNWP+HtBhVxMRNTdVhSm38AknZlD+PTAsWGu9GyLmhti2EnVwGybSD2Dxmhxk3IPCkhKAK+pl0eWYGZWG3tJ9mZ7SowcXLWDFAk0lRJnKGFMTggrWjV8GYpw5bq23VmIqqDLgkNzuoog==


sublime text

—– BEGIN LICENSE —–
Ryan Clark
Single User License
EA7E-812479
2158A7DE B690A7A3 8EC04710 006A5EEB
34E77CA3 9C82C81F 0DB6371B 79704E6F
93F36655 B031503A 03257CCC 01B20F60
D304FA8D B1B4F0AF 8A76C7BA 0FA94D55
56D46BCE 5237A341 CD837F30 4D60772D
349B1179 A996F826 90CDB73C 24D41245
FD032C30 AD5E7241 4EAA66ED 167D91FB
55896B16 EA125C81 F550AF6B A6820916
—— END LICENSE ——