QTimer timer;
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比鳳陽網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式鳳陽網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋鳳陽地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
timer.setInterval(1000);
timer.start();
connect(timer,SIGNAL(timeOut()),this,SLOT(myTimerout()));
void thisObject::myTimerOut()
{
ui-textBrowser-append(QString("hello === %1").arg(i));
}
用openpyxl讀取excel的load_workbook有個(gè)data_only參數(shù)。
例如:
yb_wb = load_workbook(u"D:\Desktop\xxx.xlsx", data_only=True)顧名思義,True時(shí),只讀data,忽略公式。
但是有個(gè)情景是——得先保留公式,根據(jù)舊公式寫入新公式。然后再讀取值進(jìn)行操作。也就是說先data_only = False,然后再data_only = True。
這樣會(huì)導(dǎo)致讀取值操作的時(shí)候,公式全部沒有了。對(duì),全部為空。就是這么奇怪。
wb = openpyxl.load_workbook(‘a(chǎn)bc.xlsx’, data_only=True)
當(dāng)’abc.xlsx’被生成并在Excel程序中打開并保存之后(這個(gè)過程Excel會(huì)把公式結(jié)果計(jì)算出來),該文件附帶有兩套值,一套是公式全都沒有計(jì)算的(data_only=False(默認(rèn))),一套是公式計(jì)算了結(jié)果的(data_only=True)。(如果沒有被Excel打開并保存,則只有一套值(data_only=False的那套,公式?jīng)]有計(jì)算結(jié)果的)。
此時(shí),以data_only=True或默認(rèn)data_only=False打開會(huì)得到兩種不同的結(jié)果,各自獨(dú)立,即data_only=True狀態(tài)下打開的,會(huì)發(fā)現(xiàn)公式結(jié)果為None(空值)或者一個(gè)計(jì)算好的常數(shù),而不會(huì)看到它原本的公式是如何。而data_only=False則只會(huì)顯示公式而已。因此,data_only=True狀態(tài)下打開,如果最后用save()函數(shù)保存了,則原xlsx文件中,公式會(huì)被替換為常數(shù)結(jié)果或空值。而data_only=False狀態(tài)下打開,最后用save()函數(shù)保存了的話,原xlsx文件也會(huì)只剩下data_only=False的那套值(即公式),另一套(data_only=True)的值會(huì)丟失,如想重新獲得兩套值,則仍舊需要用Excel程序打開該文件并保存。
解決方法:
可以定義一個(gè)刷新函數(shù)重新打開一次并保存。
from win32com.client import Dispatch
def just_open(filename):
xlApp = Dispatch("Excel.Application")
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open(filename)
xlBook.Save()
xlBook.Close()
print('自動(dòng)更新結(jié)束')
filename = r"D:\Desktop\xxx.xlsx"
just_open(filename)
先調(diào)用win32com打開一次,就OK,原公式就會(huì)變成值,后面就可以愉快的操作了。
一個(gè)建議的編程思想:
通過一個(gè)可變變量來傳遞任務(wù)完成的進(jìn)度,例如可變變量命名為p,(p位于0到1之間,表示百分比。)
主程序顯示一個(gè)progressbar,其值為p。
DoJob()在運(yùn)行過程中會(huì)更改p的值。
則此更改在mainloop()的作用下將實(shí)時(shí)顯示到progressbar上。
from?tkinter?import?*
import?time
def?updatetimer():
timer=time.strftime("%H:%M:%S")
timelabel.configure(text=timer)
timelabel.after(1000,updatetimer)
root=Tk()
timelabel=Label(root)
timelabel.pack()
timelabel.after(1000,updatetimer)
root.mainloop()
是在IDLE中? 清空當(dāng)前屏幕就可以了 cls , 或者你就重新賦值,默認(rèn)會(huì)自動(dòng)覆蓋的