Как вы обнаружили, черепаха Screen
является луком многих слоев. Есть две проблемы, которые нам нужно решить: класс _Screen
вызывает его инициализатор super (TurtleScreen's) таким образом, который не подходит для подкласса; функция Screen()
вызывается из множества мест и жестко определяет, какой класс создает экран. Итак, давайте рассмотрим обе проблемы:
import turtle
class MyScreen(turtle._Screen):
def __init__(self):
super().__init__()
turtle.TurtleScreen.__init__(self, MyScreen._canvas)
self.setup(500, 500)
self.screensize(1000, 1000)
self.title("Title")
self.bgcolor("black")
def MyScreenFunction():
if turtle.Turtle._screen is None:
turtle.Turtle._screen = MyScreen()
return turtle.Turtle._screen
turtle.Screen = MyScreenFunction
class MyTurtle(turtle.Turtle):
def __init__(self):
super().__init__(shape="circle")
wn = turtle.Screen()
tortoise = MyTurtle()
tortoise.color('white')
tortoise.circle(100)
wn.mainloop()
Однако, может быть, есть лучший путь. Черепаха может использоваться как в автономном режиме , как описано выше, так и в , встроенном в программу tkinter. встроенный подход использует RawTurtle
, TurtleScreen
и, необязательно, Scrolled Canvas
. Эти классы легче подклассить, и лучшим подходом может быть создание собственного эквивалента автономной черепахи путем внедрения черепах в tkinter и создания подклассов по мере необходимости.
Прежде чем я выброшу этот код, он мог бы также жить на stackoverflow
Что-то вдоль этих строк, кажется, добивается цели:
if (!File.Exists(DB_FILENAME))
{
var cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DB_FILENAME;
// Use a late bound COM object to create a new catalog. This is so we avoid an interop assembly.
var catType = Type.GetTypeFromProgID("ADOX.Catalog");
object o = Activator.CreateInstance(catType);
catType.InvokeMember("Create", BindingFlags.InvokeMethod, null, o, new object[] {cnnStr});
OleDbConnection cnn = new OleDbConnection(cnnStr);
cnn.Open();
var cmd = cnn.CreateCommand();
cmd.CommandText = "CREATE TABLE VideoPosition (filename TEXT , pos LONG)";
cmd.ExecuteNonQuery();
}
Этот код иллюстрирует, что можно получить доступ к использованию базы данных OleDbConnection однажды его созданный с COM-компонентом ADOX.Catalog.
Я сделал то же как Autsin, создаю дб Доступа, затем включал его в мой проект как управляемый ресурс. Однажды там, это включено в скомпилированный код, и можно скопировать его в жесткий диск так много раз, как Вы хотите. Пустые базы данных являются относительно маленькими также, таким образом, там не является много служебным.
Добавленная премия является способностью настроить базу данных, если Вы знаете, как она будет использоваться или какие таблицы будут добавлены каждый раз, когда можно уменьшить объем кодирования и замедлить запросы базы данных.
Вам не нужна Струя (сильная головная боль) установленный при использовании этой строки подключения в .net 3.5
Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=C:\myFolder\myAccess2007file.accdb;Persist
Security Info=False;
Это должно работать над доступом 2007 и ниже
Интересный вопрос - я никогда не думал для создания одного динамического как это. Я всегда включал свою базовую базу данных как ресурс в проекте и делал копию, когда мне был нужен новый.