我需要在main.py里从window.py中获取列表text_content的值,但是失败了,有没有大佬知道为什么,代码如下
```python
mian.py
import window
from window import text_content
def main():
window.mainWin()
content = text_content
print(content)
main()
window.py
from tkinter import *
from tkinter import scrolledtext
text_content = []
class Application(Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.grid()
self.createWidget()
def createWidget(self):
self.la2 = Label(self, text='重量(kg):').grid(row=1, column=0, padx=(10, 0))
self.en2 = Entry(self)
self.en2.grid(row=1, column=1, columnspan=1, padx=(0, 10), ipadx=20) # 1行1列,跨2列
self.btn = Button(self, text="确定", command=self.click_btn).grid(row=1, column=2, padx=(0, 30), ipadx=30)
self.btn2 = Button(self, text="输入完毕", command=self.click_btn2).grid(row=4, column=2, padx=(0, 30), ipadx=30)
self.text = scrolledtext.ScrolledText(self, width=50, height=20)
self.text.grid(row=3, column=0, columnspan=3, padx=5, pady=10)
def click_btn(self):
input2 = self.en2.get()
str = input2 + ' '
#print(getinputstr)
print(input1, input2)
self.text.insert('1.0', str+'\n')
self.en2.delete(0, END)
def click_btn2(self):
text_content = (self.text.get('0.0', 'end').replace('\n', ' ')).split()
print(text_content)
#return text_content
def mainWin():
root = Tk()
root.title('NuContent')
sw = root.winfo_screenwidth()
sh = root.winfo_screenheight()
ww = 410
wh = 400
x = (sw - ww)/2
y = (sh - wh)/3
root.geometry("%dx%d+%d+%d" % (ww, wh, x, y))
root.resizable(False, False)
app = Application(master=root)
app.mainloop()
```
爬取某网站(不便透露)的帖子过程中,发现数据解析不对,中文乱码,或者只能解析出一半的中文。
开发者模式查看到charset="gbk"
然而该网页的编码方式如下:
response = requests.get(test_url)
print(response.encoding) #查看网页返回的字符集类型
print(response.apparent_encoding) #自动判断字符集类型
输出为:
ISO-8859-1
GB2312
enconding是从http从中猜测的响应内容编码方式,若header中没有charset字段则默认为ISO-8859-1编码模式,则无法解析中文。
apparent——encoding是从内容中分析出的响应内容编码方式。
因此,requess模块猜测网页的编码方式与实际的编码方式不同,网页申明的编码方式是gbk。
尝试输出print(response.text[:1000]),结果如下
再尝试输出print(response.text[:1000])结果如下:
最后我是这样解决的,我之所以要在main里引用text_content是因为我把数据处理的命令写在了main里,只要把数据处理命令挪到click_btn函数里就可以了。仅仅是将text_content设置为全局变量无法解决在main里引用为空值的问题。
在main.py中,你需要从window.py中获取列表text_content的值,但是你的尝试没有成功。下面是代码和解释。
import window
from window import text_content
def main():
window.mainWin()
content = text_content
print(content)
main()
在这里,我们导入了window.py并从中导入text_content。在main函数中,我们调用了window.py中的主函数mainWin(),但是我们直接调用text_content并不会获取到正确的值。我们需要在click_btn2函数中将text_content赋值为全局变量,这样我们才能在main函数中获取到正确的值。
def click_btn2(self):
global text_content # 声明text_content为全局变量
text_content = (self.text.get('0.0', 'end').replace('\\n', ' ')).split()
print(text_content)
在click_btn2函数中,我们需要将text_content赋值为全局变量,这样我们才能在main函数中获取到正确的值。我们将text_content从ScrolledText中获取,然后将其转化为列表并赋值给text_content。这样,我们就能在main函数中获取到正确的值了。
window.py
from tkinter import *
from tkinter import scrolledtext
text_content = []
class Application(Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.grid()
self.createWidget()
def createWidget(self):
self.la2 = Label(self, text='重量(kg):').grid(row=1, column=0, padx=(10, 0))
self.en2 = Entry(self)
self.en2.grid(row=1, column=1, columnspan=1, padx=(0, 10), ipadx=20) # 1行1列,跨2列
self.btn = Button(self, text="确定", command=self.click_btn).grid(row=1, column=2, padx=(0, 30), ipadx=30)
self.btn2 = Button(self, text="输入完毕", command=self.click_btn2).grid(row=4, column=2, padx=(0, 30), ipadx=30)
self.text = scrolledtext.ScrolledText(self, width=50, height=20)
self.text.grid(row=3, column=0, columnspan=3, padx=5, pady=10)
def click_btn(self):
input2 = self.en2.get()
str = input2 + ' '
#print(getinputstr)
print(input1, input2)
self.text.insert('1.0', str+'\\n')
self.en2.delete(0, END)
def click_btn2(self):
global text_content # 声明text_content为全局变量
text_content = (self.text.get('0.0', 'end').replace('\\n', ' ')).split()
print(text_content)
def mainWin():
root = Tk()
root.title('NuContent')
sw = root.winfo_screenwidth()
sh = root.winfo_screenheight()
ww = 410
wh = 400
x = (sw - ww)/2
y = (sh - wh)/3
root.geometry("%dx%d+%d+%d" % (ww, wh, x, y))
root.resizable(False, False)
app = Application(master=root)
app.mainloop()