天气预报

下载:/uploadfile/200810/4/214444761.zip

演示图:

代码:

#cs ____________________________________

 AutoIt 版本: 3.2.13.7 (第一版)
 脚本作者: yEn
    Email: yen861220@yeah.net
    QQ/TM:
 脚本版本: 0.0.0.19
 脚本功能: 天气预报

#ce _______________脚本开始_________________
#NoTrayIcon ;隐藏托盘图标
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <IE.au3> ;IE UDF
#include <GuiComboBox.au3> ;ComboBox UDF
#include <GDIPlus.au3> ;Plus UDF

opt('GUIResizeMode', 805) ;调整窗口大小,同时保持控件位置

Dim $IE_Ver,$Ping_Net
Dim $XMLFile,$Read_Assign_City
Dim $Now_Temperature,$Now_Time,$Day[3],$Png[8],$Weather[3],$Wind_Temperature[3]
Dim $Show_Big_Image_File,$Show_Small_A_Tomorrow_Image_File,$Show_Small_Today_Image_File,$Show_Small_Tomorrow_Image_File
Dim $Show_Big_Image,$Show_Small_A_Tomorrow_Image,$Show_Small_Today_Image,$Show_Small_Tomorrow_Image
Dim $hGraphic

$Seting_Title = "天气预报 by yEn"
If WinExists($Seting_Title) Then  ;判断程序是否已经运行
   MsgBox(48,"警告","程序已经运行了!")
   Exit
EndIf
AutoItWinSetTitle($Seting_Title)

$Set_On = False ;判断是否有打开设置!
$IE_Ver = StringLeft(RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer","Version"),3) ;读取IE版本

$XMLFile = @ScriptDir & "\Seting.xml" ;定义配置文件路径

$TQ_Gui = GUICreate($Seting_Title, 259, 210, @DesktopWidth-259, 75, $WS_POPUP, $WS_EX_TOOLWINDOW)
GUISetBkColor(0xC0DCC0)
$Label_City = GUICtrlCreateLabel("", 8, 3, 191, 24)
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
$Prov_and_Time = GUICtrlCreateLabel("", 28, 29, 138, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
$Now_Weather = GUICtrlCreateLabel("", 10, 47, 171, 23)
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
$Line_1 = GUICtrlCreateLabel("__________________________________", 8, 68, 242, 14)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
$Label4 = GUICtrlCreateLabel("预计未来24、48小时的天气:", 40, 88, 175, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
$Label_Today = GUICtrlCreateLabel("", 8, 112, 64, 17)
GUICtrlSetColor(-1, 0x008000)
$Label_Today_Weather = GUICtrlCreateLabel("", 96, 112, 28, 17)
GUICtrlSetColor(-1, 0x008000)
$Label_Today_Temp = GUICtrlCreateLabel("", 128, 112, 138, 17)
GUICtrlSetColor(-1, 0x008000)
$Label_Tomorrow = GUICtrlCreateLabel("", 8, 136, 64, 17)
GUICtrlSetColor(-1, 0x008000)
$Label_A_Tomorrow = GUICtrlCreateLabel("", 8, 160, 64, 17)
GUICtrlSetColor(-1, 0x008000)
$Label_Tomorrow_Weather = GUICtrlCreateLabel("", 96, 136, 28, 17)
GUICtrlSetColor(-1, 0x008000)
$Label_A_Tomorrow_Weather = GUICtrlCreateLabel("", 96, 160, 28, 17)
GUICtrlSetColor(-1, 0x008000)
$Label_Tomorrow_Temp = GUICtrlCreateLabel("", 128, 136, 138, 17)
GUICtrlSetColor(-1, 0x008000)
$Label_A_Tomorrow_Temp = GUICtrlCreateLabel("", 128, 160, 138, 17)
GUICtrlSetColor(-1, 0x008000)
$Quit = GUICtrlCreateLabel("退出", 224, 192, 28, 17)
GUICtrlSetFont(-1, 8, 400, 4, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
GUICtrlSetCursor (-1, 0)
$setting = GUICtrlCreateLabel("设置", 184, 192, 28, 17)
GUICtrlSetFont(-1, 8, 400, 4, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
GUICtrlSetCursor (-1, 0)
$Refurbish = GUICtrlCreateLabel("刷新", 144, 192, 28, 17)
GUICtrlSetFont(-1, 8, 400, 4, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
GUICtrlSetCursor (-1, 0)
$Line_2 = GUICtrlCreateLabel("__________________________________", 8, 208, 242, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
$Label21 = GUICtrlCreateLabel("省:", 8, 234, 28, 17)
GUICtrlSetColor(-1, 0x008000)
$Combo_Prov = GUICtrlCreateCombo("", 40, 231, 129, 25)
$Label22 = GUICtrlCreateLabel("市:", 8, 265, 28, 17)
GUICtrlSetColor(-1, 0x008000)
$Combo_City = GUICtrlCreateCombo("", 40, 263, 129, 25)
$Ok = GUICtrlCreateLabel("确定", 183, 265, 28, 17)
GUICtrlSetFont(-1, 8, 400, 4, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
GUICtrlSetCursor (-1, 0)
$Cancel = GUICtrlCreateLabel("取消", 222, 265, 28, 17)
GUICtrlSetFont(-1, 8, 400, 4, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
GUICtrlSetCursor (-1, 0)
$Label_State = GUICtrlCreateLabel("", 8, 192, 125, 17)
GUICtrlSetColor(-1, 0x800000)
$Label_About = GUICtrlCreateLabel("by yEn", 184, 233, 59, 24)
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x800000)

GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST") ;拖动窗口
_GDIPlus_StartUp ()

GUISetState(@SW_SHOW)

GUICtrlSetData($Label_State,"正在检查网络...")
$Ping_Net=Ping("www.soso.com",300)  ;检查是否有连接网络
If $Ping_Net Then ;如果连接失败,退出程序
   GUICtrlSetData($Label_State,"连接网络成功...")
Else
   Msgbox(48,"连接失败","无法更新信息,请检查你的网络!")
   Exit
EndIf

TQ_Load() ;初始化

       
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Quit   ;退出
            Exit
        Case $Setting  ;设置
          If $Set_On = False Then  ;判断是是否打开了设置
              WinMove($TQ_Gui,"",Default,Default,Default,296)
              $Set_On = True
           Else
               WinMove($TQ_Gui,"",Default,Default,Default,210)
              $Set_On = False            
          EndIf
       Case $Combo_Prov ;读取省里所有的市
           R_Combo_City(GUICtrlRead($Combo_Prov))
        Case $Cancel  ;取消
            WinMove($TQ_Gui,"",Default,Default,Default,210)
            $Set_On = False
        Case $Refurbish ;刷新
             TQ_Load()
        Case $Ok   ;确定
             $objXML=ObjCreate("Microsoft.XMLDOM")
              $objXML.load($XMLFile)
              $ReadConfig = $objXML.documentElement.selectSingleNode("Config")
             $ReadConfig.childNodes.item(0).text = GUICtrlRead($Combo_City)
             $objXML.save($XMLFile)
             WinMove($TQ_Gui,"",Default,Default,Default,210)
             $Set_On = False
             TQ_Load()
    EndSwitch
WEnd
_GDIPlus_GraphicsDispose ($hGraphic)
_GDIPlus_ImageDispose ($Show_Big_Image)
_GDIPlus_ImageDispose ($Show_Small_Today_Image)
_GDIPlus_ImageDispose ($Show_Small_Tomorrow_Image)
_GDIPlus_ImageDispose ($Show_Small_A_Tomorrow_Image)
_GDIPlus_ShutDown ()




Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    If ($hWnd = $TQ_Gui) and ($iMsg = $WM_NCHITTEST) then Return $HTCAPTION;
EndFunc


Func TQ_Load() ;初始化
    GUICtrlSetData($Label_State,"正在读取配置文件...")
    If FileExists($XMLFile) = 0 Then   ;检查配置XML文件是否存在
       If MsgBox(4+16+0,"文件错误","读取文件失败,是否要恢复文件?!")=6 Then
         FileInstall("C:\Seting.xml","Seting.xml") ;"C:\Seting.xml,在编译的时候,要注意!"
         Read_AssignCity()  ;读取指定城市
       Else
          Exit
       EndIf
    Else
      Read_AssignCity()
    EndIf

    GUICtrlSetData($Label_State,"正在更新天气信息...") ;更新信息
    Read_TQ_Xinxi()

    GUICtrlSetData($Label_State,"正在加载天气信息...") ;加载信息
    Display_Xinxi()
    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")  ;显示图片
    Display_PNG()
    GUICtrlSetData($Label_State,"完成!")
EndFunc


Func Read_AssignCity()  ;读取配置文件指定城市
    Local $objXML,$ReadConfig,$AllNum,$i
    Local $ReadCityList,$Read_Prov,$Read_City
    $objXML=ObjCreate("Microsoft.XMLDOM")
     $objXML.load($XMLFile)
     $ReadConfig = $objXML.documentElement.selectSingleNode("Config")
     $AllNum = $ReadConfig.childNodes.length - 1
     If $AllNum >= 0 Then
        For $i=0 To $AllNum
            $Read_Assign_City = $ReadConfig.childNodes.item($i).childNodes.item(0).text
        Next
    EndIf
   
    $ReadCityList=$objXML.documentElement.selectSingleNode("City_List")  ;读取配置文件里所有的省份,并添加到$Combo_Prov里
    $AllNum=$ReadCityList.childNodes.length - 1
    If $AllNum >= 0 Then
       For $i=0 To $AllNum
          $Read_Prov=$ReadCityList.childNodes.item($i).childNodes.item(0).text
          $Read_City=$ReadCityList.childNodes.item($i).childNodes.item(1).text
           _GUICtrlComboBox_AddString($Combo_Prov,$Read_Prov)
     Next
    EndIf
    _GUICtrlComboBox_SetCurSel($Combo_Prov,0)
    R_Combo_City(GUICtrlRead($Combo_Prov)) ;读取省份里所有的市
   
    If $Read_Assign_City = "" Then ;不能为空,所以空的就退出
        MsgBox(16,"错误","配置文件有误,不能正常读取!")
        Exit
    EndIf
    Return
 EndFunc
 
 Func Read_TQ_Xinxi() ;读取天气信息
    Local $oIE,$sHTML,$i,$Temp,$Weather_Temp[3],$Wind_Temperature_Temp[3]
    ShellExecute ("iexplore.exe", "about:blank","","",@SW_HIDE)
    If $IE_Ver > "6.0" Then ;如果IE版本高过6.0的话,IE的标题文字是"空白页"
        WinWait ("空白页")
     Else
       WinWait ("about:blank")
     EndIf
     
    $oIE = _IEAttach ("about:blank", "url")
    _IELoadWait ($oIE)
    _IENavigate ($oIE, "http://www.soso.com/tb.q?cid=tb.tq&cin=&city=" & $Read_Assign_City)
     $sHTML = _IEBodyReadHTML ($oIE)
    ;下面这6行代码研究了很久,也是本程序的核心代码。
    ;虽然不是很精确的读取到想要的数据,但经过处理还是可以的.
    ;------------------------------------------------
    $Now_Temperature_Array = StringRegExp($sHTML, "<(?i)strong class=fs_14>(.*?)</(?i)strong>",1)   ;现时温度和气候
    $Now_Time_Array = StringRegExp($sHTML, "<(?i)li>(.*?)<(?i)br>",1) ;当前时间
    $Day_Array = StringRegExp($sHTML, "<(?i)div class=today>(.*?)</(?i)div>",3)  ;日期(今天,明天,后天)
    $Png_Array = StringRegExp($sHTML, "(src=" & "'" & "(.*?)" & "'" & ", sizingMethod=" & "'" & "scale" & "')",3)  ;图片
    $Weather_Array = StringRegExp($sHTML, "></(?i)span>(.*?)\n<DIV",3) ;未来气候
    $Wind_Temperature_Array = StringRegExp($sHTML, "<(?i)div style=" & '"' & "TEXT-ALIGN: center" & '"' & ">(.*?)</(?i)DIV>",3) ;未来的温度和风向
    ;-------------------------------------------------
    ;分析现时温度和气候,并且整理数据
    For $i = 0 To UBound($Now_Temperature_Array) -1
        $Temp = $Now_Temperature_Array[$i]
    Next
    $Now_Temperature = StringReplace($Temp, "&nbsp;", " ")
    ;整理当时时间
    For $i = 0 To UBound($Now_Time_Array) -1
        $Temp = $Now_Time_Array[$i]
    Next
    $Now_Time = StringRight($Temp,5)
    ;整理日期
    For $i = 0 To UBound($Day_Array) -1
        $Day[$i]=$Day_Array[$i]
    Next
    ;整理图片
    For $i = 0 To UBound($Png_Array) -1
        $Png[$i] = $Png_Array[$i]
    Next
    ;整理未来的气候数据
    For $i = 0 To UBound($Weather_Array) -1
        $Weather_Temp[$i] = $Weather_Array[$i]
    Next
    For $i = 0 To 2
        $Weather[$i] = StringStripCR(StringReplace($Weather_Temp[$i], "&nbsp;", ""))
    Next
    ;整理未来的温度和风向数据
    For $i = 0 To UBound($Wind_Temperature_Array) -1
        $Wind_Temperature_Temp[$i] = $Wind_Temperature_Array[$i]
    Next
    For $i = 0 To 2
        $Wind_Temperature[$i] = StringReplace($Wind_Temperature_Temp[$i], "<BR>", " ")
    Next
   
    _IEQuit ($oIE) ;关闭IE
   
    Return

EndFunc
   
Func Display_Xinxi() ;加载信息
    Local $Big_Image,$Day_or_Night_Temp,$Day_or_Night
    GUICtrlSetData($Label_City,$Read_Assign_City)
    GUICtrlSetData($Prov_and_Time,"现时 " & $Now_Time & " 的天气:")
    GUICtrlSetData($Now_Weather,$Now_Temperature)
    GUICtrlSetData($Label_Today,$Day[0])
    GUICtrlSetData($Label_Today_Weather,$Weather[0])
    GUICtrlSetData($Label_Today_Temp,$Wind_Temperature[0])
   
    GUICtrlSetData($Label_Tomorrow,$Day[1])
    GUICtrlSetData($Label_Tomorrow_Weather,$Weather[1])
    GUICtrlSetData($Label_Tomorrow_Temp,$Wind_Temperature[1])
   
    GUICtrlSetData($Label_A_Tomorrow,$Day[2])
    GUICtrlSetData($Label_A_Tomorrow_Weather,$Weather[2])
    GUICtrlSetData($Label_A_Tomorrow_Temp,$Wind_Temperature[2])
   
    $Big_Image = StringTrimLeft($Png[1],StringInStr($Png[1],"/",0, -1))
    $Day_or_Night_Temp = StringTrimLeft($Png[1],StringInStr($Png[1],"/",0, -2))
    $Day_or_Night = StringTrimRight($Day_or_Night_Temp,9)
    ;发现显示大的图标的路径白天跟晚上的不一样,研究了一下发现只有两个图标不一样而已
    ;下面的代码做了一些处理.
    If $Day_or_Night = "day" Then
        If $Big_Image <> "b_a0.png" And $Big_Image <> "b_a1.png" Then
            $Show_Big_Image_File = @ScriptDir & "\Image\Big\" & $Big_Image
        ElseIf $Big_Image = "b_a0.png" Then
            $Show_Big_Image_File = @ScriptDir & "\Image\Big\b_day_a0.png"
        ElseIf $Big_Image = "b_a1.png" Then
            $Show_Big_Image_File = @ScriptDir & "\Image\Big\b_day_a1.png"
        EndIf
    ElseIf $Day_or_Night = "night" Then
           If $Big_Image <> "b_a0.png" And $Big_Image <> "b_a1.png" Then
              $Show_Big_Image_File = @ScriptDir & "\Image\Big\" & $Big_Image
           ElseIf $Big_Image = "b_a0.png" Then
              $Show_Big_Image_File = @ScriptDir & "\Image\Big\b_night_a0.png"
           ElseIf $Big_Image = "b_a1.png" Then
              $Show_Big_Image_File = @ScriptDir & "\Image\Big\b_night_a1.png"
           EndIf
    EndIf
    $Show_Small_Today_Image_File = @ScriptDir & "\Image\Small\" & StringTrimLeft($Png[3],StringInStr($Png[3],"/",0, -1))
    $Show_Small_Tomorrow_Image_File = @ScriptDir & "\Image\Small\" & StringTrimLeft($Png[5],StringInStr($Png[5],"/",0, -1))
    $Show_Small_A_Tomorrow_Image_File = @ScriptDir & "\Image\Small\" & StringTrimLeft($Png[7],StringInStr($Png[7],"/",0, -1))
   
    Return
 EndFunc
 
 Func R_Combo_City($R_Por) ;读取省里的所有市
     Local $objXML,$AllNum,$i,$Read_Prov,$Read_City
     _GUICtrlComboBox_ResetContent($Combo_City)
      $objXML=ObjCreate("Microsoft.XMLDOM")
      $objXML.load($XMLFile)
      $ReadCityList=$objXML.documentElement.selectSingleNode("City_List")
      $AllNum=$ReadCityList.childNodes.length - 1
      If $AllNum >= 0 Then
         For $i=0 To $AllNum
            $Read_Prov=$ReadCityList.childNodes.item($i).childNodes.item(0).text
            $Read_City=$ReadCityList.childNodes.item($i).childNodes.item(1).text
            If $R_Por=$Read_Prov Then
               GUICtrlSetData($Combo_City,$Read_City)
            EndIf
         Next
      EndIf
      _GUICtrlComboBox_SetCurSel($Combo_City,0)
     
     Return
EndFunc
  
Func Display_PNG() ;显示PNG图片,参考论坛里显示PNG文章
     $Show_Big_Image = _GDIPlus_ImageLoadFromFile ($Show_Big_Image_File)
    $Show_Small_Today_Image = _GDIPlus_ImageLoadFromFile ($Show_Small_Today_Image_File)
    $Show_Small_Tomorrow_Image = _GDIPlus_ImageLoadFromFile ($Show_Small_Tomorrow_Image_File)
    $Show_Small_A_Tomorrow_Image = _GDIPlus_ImageLoadFromFile ($Show_Small_A_Tomorrow_Image_File)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($TQ_Gui)
     _WinAPI_InvalidateRect(WinGetHandle($TQ_Gui)) 
 EndFunc
 
 Func MY_WM_PAINT($hWnd, $msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($TQ_Gui, 0, 0, $RDW_UPDATENOW)
    If $hGraphic <> "" Then
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $Show_Big_Image, 192, 16, 60, 50)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $Show_Small_Today_Image, 72, 109, 16, 16)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $Show_Small_Tomorrow_Image, 72, 133, 16, 16)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $Show_Small_A_Tomorrow_Image, 72, 157, 16, 16)
    EndIf
    _WinAPI_RedrawWindow($TQ_Gui, 0, 0, $RDW_VALIDATE)
     Return $GUI_RUNDEFMSG
EndFunc   ;==>MY_WM_PAINT
申明:本站资源大部分来自网络,如果无意侵犯了你的权利,请及时通知我们 AutoIt@FoxMail.Com,我们将尽快处理
Copyright © 2008-2009 随便复制 共享精神 人人有责 All Right Reserved
粤ICP备08009024号