我正在编写一个程序,我想使程序的CORE与GUI(由Tkinter构建)分开。但是,有两个单独的python文件,我遇到以下问题:
GUI.py
import scrapy
class Brandon251Spider(scrapy.Spider):
name = "Brandon251"
def start_requests(self):
urls = [
"https://www.251brandon.com/floorplans"
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
price = response.css('.fp-price').extract()
yield {
'test': price
}
CORE.py
def bar():
if a == 'something':
foo()
Button(text="START!", command=bar).grid(row=1, column=1)
当我从CORE.py启动程序时,我得到:
from GUI import *
def foo():
<do something>
我不知道确切要去哪里寻找什么。
答案 0 :(得分:3)
您在foo()
中有GUI.py
,但是当从from GUI import *
调用CORE.py
行时尚未定义,因此错误。
在这种简单情况下,您可以将foo
的定义移至GUI.py
通常,GUI取决于“核心”模块,而不是相反。
答案 1 :(得分:2)
我认为您应该以其他方式引用您的模块:
# core.py
def foo():
# Do something
然后从GUI模块中引用并调用您的核心模块
# gui.py
from core import foo
def bar():
foo()
答案 2 :(得分:2)
该域具有不同的层(您称为“核心”),并且UI是非常理智的设计,但前提是该域对UI一无所知-而是UI必须依赖于域,而不是其他域一路走来。 IOW,您不想在“ core”中导入“ gui”,而是在“ gui”中导入“ core”。
如果内核需要将某些事件/条件通知给gui,则可以使用the observer pattern的某些变体。
请注意:如果您珍视自己的理智,切勿使用星号导入(“从某物导入*”)-除非在python shell或一次性抛出脚本中使用,否则不要使用。